2012-06-18 5 views
1

Ищу в метод, чтобы преобразовать массив байтов в шестнадцатеричную строку здесь является то, что я закодированы:Преобразовать массив байтов в шестнадцатеричную строку в простом старом C

unsigned char buffer[] = {0xAA,0xBB,0x01,0xAB,0x11,0x12,0x13,0x22,0x11,0x14}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

       char * asta = (char*)malloc(16); 
       memset(asta,0,16); 
       int k; 
       for (k = 0; k < 16 ; k++) 
       { 
        sprintf(&asta[k],"%X",buffer[4 + k]); 
       } 

       printf("%s",asta); 

    _getch(); 
} 

только первый байт преобразуется правильно отдыхать нет. Как я могу исправить код?

+3

'buffer' имеет только 10 элементов, вы обращаетесь за пределы. –

+3

1. Для десяти шестнадцатеричных чисел недостаточно 16 байт; 2. Вы никогда не освобождаете память; 3. каждому шестнадцатеричному числу требуется 2 байта. – pmg

+0

@ DanielFischer код не работает из-за других причин, если вы укажете меня в правильном направлении, я смогу его изменить. Я не думаю, что я использую sprintf хорошо! – opc0de

ответ

1

Вы должны помнить, что двухзначные шестнадцатеричные числа будут по-прежнему иметь две цифры, когда вы печатаете его как строку, т. Е. Оно будет занимать два символа.

В цикле, вторая итерация будет перезаписывать второй символ строки, третья итерация будет перезаписывать третий символы и т.д.

Кроме того, поскольку каждое двузначное число будет использовать два символ, вы должны выделить память на 32 символа, plus один для строки, заканчивающейся '\0' персонаж.

И как отмечено в комментариях, вы получаете доступ к данным за пределами вашего массива.

+0

Кроме того, он должен сделать преобразование, используя строку формата «% 02X» вместо% X, иначе будут некоторые байты, которые преобразуются в шестнадцатеричные только с одной цифрой, что будет проблемой, когда вы хотите конвертировать из шестнадцатеричного в снова двоичный. – nos

3

У вас в вашем массиве 10 байт, поэтому для вашего буфера требуется не менее 21 байта (для каждого байта + 1 для нулевого терминатора требуется 2 шестнадцатеричных цифры).

Я не понимаю, что вы делаете здесь:

sprintf(&asta[k],"%X",buffer[4 + k]); 

Почему вы начинаете с пятого байта в буфере? Кроме того, каждый байт в вашем буфере занимает два байта в строке, поэтому вам нужно распечатать до asta[2 * k].

Собираем вместе вы получите что-то вроде:

char * asta = (char*)calloc(2 * sizeof buffer + 1, sizeof(char)); // calloc automatically zeros asta 
int k; 
for (k = 0; k < sizeof buffer ; k++) 
{ 
    sprintf(&asta[2 * k],"%02X", (unsigned int)buffer[k]); // Not sure if the cast is needed 
} 
printf("%s",asta); 
Смежные вопросы