Я хотел бы взять int и преобразовать его в массив шестнадцатеричных чисел uint8_t? После преобразования длина int составляет не более 8 байтов в HEX. Я смог использовать метод, который преобразует int (19604) в массив uint8_t следующим образом:

00-00-00-00-00-00-00-00-04-0C-09-04

Но мне нужно, чтобы это выглядело так:

00-00-00-00-00-00-00-00-00-00-4C-94

Я использовал следующий алгоритм:

void convert_file_size_to_hex(long int size)
{
    size_t wr_len = 12;
    long int decimalNumber, quotient;
    int i=wr_len, temp;

    decimalNumber = size;
    quotient = decimalNumber;
    uint8_t hexNum[wr_len];
    memset(hexNum, 0, sizeof(hexNum));

    while(quotient != 0) {
        temp = quotient % 16;
        hexNum[--i] = temp;
        quotient /= 16;
}

Как я могу это сделать? Следует ли мне использовать другой алгоритм или попытаться немного изменить результат? Я как бы новичок в бит-смещении в C, поэтому некоторая помощь будет отличной. Спасибо!

2
Eric Horng 27 Ноя 2016 в 13:16

3 ответа

Лучший ответ

Рассмотрим следующий код:

#include <stdio.h>
#include <string.h>

int main()
{
    unsigned char hexBuffer[100]={0};
    int n=19604;
    int i;

    memcpy((char*)hexBuffer,(char*)&n,sizeof(int));

    for(i=0;i<4;i++)
        printf("%02X ",hexBuffer[i]);

    printf("\n");

    return 0;
}

Используйте простой оператор для преобразования int в байтовый буфер

memcpy((char*)hexBuffer,(char*)&n,sizeof(int));

Вы можете использовать 8 вместо 4 при печати цикла

1
Mike 27 Ноя 2016 в 12:19

Поскольку n % 16 имеет диапазон от 0 до 15 включительно, вы создаете массив одиночных шестнадцатеричных цифр из вашего числа. Если вы хотите создать массив байтов, используйте вместо этого 256:

while(quotient != 0) {
    temp = quotient % 256;
    hexNum[--i] = temp;
    quotient /= 256;
}

Вы можете переписать то же самое с битовыми сдвигами и битовой маской:

while(quotient != 0) {
    temp = quotient & 0xFF;
    hexNum[--i] = temp;
    quotient >>= 8;
}

Чтобы узнать, сколько байтов вам нужно независимо от системы, используйте sizeof(int):

size_t wr_len = sizeof(int);
1
dasblinkenlight 27 Ноя 2016 в 10:24

Используйте для этого союз

union int_to_bytes {
        int i;
        uint8_t b[sizeof(int)];
};

union int_to_bytes test = { .i = 19604 };

int i = sizeof(test.b); // Little-Endian
while (i--)
        printf("%hhx ", test.b[i]); // 0 0 4c 94

putchar('\n');
0
Ray Hamel 27 Ноя 2016 в 12:25