2012-05-22 2 views
1

У меня есть переменная char* etag="8a964ee2a5e88be344f36c22562a6486";.Разбор шестнадцатеричных чисел в массив

Как это преобразовать в массив из byte, где byte на самом деле typedef unsigned char byte?

+7

Это шестигранной уже, так как строка. Какой тип вы думали хранить? Это немного длиннее для 'unsigned long long' даже – Flexo

+0

Дубликат: http://stackoverflow.com/questions/3381614/c-convert-string-to-hexadecimal-and-vice-versa? – Jay

+0

@Jay ответы есть все C++, но это помечено C – Flexo

ответ

6
byte bytes[16]; 
int i=0; 
for (;i<16;++i) { 
    int value; 
    sscanf(etag+2*i,"%02x",&value); 
    bytes[i] = value; 
} 
+1

Копирование моего ответа и использование немного более сложной функции - это не весело. –

+2

@ H2CO3 - чтобы дать ему преимущество в сомнении, он опубликовал всего несколько минут после того, как вы и его ответ достаточно различны от вашего, что потребовалось бы более трех минут, чтобы превратить ваш ответ в него, Я верю, что он вас скопировал. Поэтому я дал вам обоих +1. Надеюсь, это утешение для вас. – Spudley

+0

Spudley: Благодарю вас, и да, возможно, вы правы. –

5

Если я правильно понимаю, вы хотите сделать 2-буквенные группы шестнадцатеричных символов в байтах, а затем сохранить эти байты в вашем массиве символов. Попробуйте это:

char *str = "long hex string"; 

int i; 
unsigned char bytes[16]; 
char tmp[3] = { 0 }; 
for(i = 0; i < 16; i++) 
{ 
    memcpy(tmp, str + 2 * i, 2); 
    bytes[i] = (unsigned char)strtol(tmp, NULL, 16); 
} 
2

вы, вероятно, использовать strtol

ниже приведен пример программы:

/**************************************************************** 
* 
* Purpose: To show examples of the strtol function. 
* Author: M.J. Leslie 
* Date: 06-Nov-94 
* 
****************************************************************/ 

#include <stdlib.h> 

main() 
{ 
    char num[10]; 

       /* Test a valid number  */ 
    strcpy(num,"13"); 

    printf("%s(Oct) is %i(Dec)\n", num, strtol(num, NULL, 8)); 
    printf("%s(Dec) is %i(Dec)\n", num, strtol(num, NULL, 10)); 
    printf("%s(hex) is %i(Dec)\n", num, strtol(num, NULL, 16)); 

    puts("----------------------------------"); 

       /* Test a slightly valid number 
       * Returns the same results as 
       * above.   */ 
    strcpy(num, "13hzcd"); 

    printf("%s(Oct) is %i(Dec)\n", num, strtol(num, NULL, 8)); 
    printf("%s(Dec) is %i(Dec)\n", num, strtol(num, NULL, 10)); 
    printf("%s(hex) is %i(Dec)\n", num, strtol(num, NULL, 16)); 

    puts("----------------------------------"); 

       /* Test an invalid number 
       * Returns ZERO   */ 
    strcpy(num, "hzcd"); 

    printf("%s(Oct) is %i(Dec)\n", num, strtol(num, NULL, 8)); 
    printf("%s(Dec) is %i(Dec)\n", num, strtol(num, NULL, 10)); 
    printf("%s(hex) is %i(Dec)\n", num, strtol(num, NULL, 16)); 


    puts("----------------------------------"); 

       /* Test 0 base. 
       * This will look at the number 
       * and decide the base for its self! 
       */ 
    strcpy(num, "13"); 
    printf("%s is %i(Dec)\n", num, strtol(num, NULL, 0)); 

    strcpy(num, "013"); 
    printf("%s is %i(Dec)\n", num, strtol(num, NULL, 0)); 

    strcpy(num, "0x13"); 
    printf("%s is %i(Dec)\n", num, strtol(num, NULL, 0)); 

} 

/**************************************************************** 
* 
* Results of the program: 
* 
* 13(Oct) is 11(Dec) 
* 13(Dec) is 13(Dec) 
* 13(hex) is 19(Dec) 
* ---------------------------------- 
* 13hzcd(Oct) is 11(Dec) 
* 13hzcd(Dec) is 13(Dec) 
* 13hzcd(hex) is 19(Dec) 
* ---------------------------------- 
* hzcd(Oct) is 0(Dec) 
* hzcd(Dec) is 0(Dec) 
* hzcd(hex) is 0(Dec) 
* ---------------------------------- 
* 13 is 13(Dec) 
* 013 is 11(Dec) 
* 0x13 is 19(Dec) 
* 
****************************************************************/ 
+0

вы можете добавить пример, показывающий, как использовать его для разбиения на массив байтов? – Flexo

Смежные вопросы