Преобразование двоичного символа [] в шестнадцатеричный символ [] - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть unsigned char [], который содержит двоичный текст. Мне нужно преобразовать этот двоичный текст в шестнадцатеричный. Мне удалось сделать это и вывести результат в файл. Однако по соображениям скорости я хотел бы напрямую вывести это на символ [], чтобы я мог дальше манипулировать им. Ниже приведен код, который записывает в файл:

for( i = 0; i < rsa.len; i++ )
fprintf( f, "%02X%s", buf[i],
             ( i + 1 ) % 16 == 0 ? "\r\n" : " " );

И buf определяется следующим образом:

unsigned char buf[512];

Вывод в файл выглядит следующим образом:

11 51 64 36 7A 9D 6C E8 F5 5C B2 29 2D 2F 1B 87
0A 20 23 3F B4 B0 41 5F A1 5F 54 6A C4 44 49 4B
58 C1 91 67 7D 7F 70 8D 20 9A 86 06 89 3A A8 2A
26 18 7A CE AB C0 7B 2A D7 A4 B2 5B C6 76 EB EA
90 F9 59 6C 78 4A 7C B2 A6 AE 46 3E E0 A7 A7 6A
F6 81 E3 70 78 B7 0D CC 8B D2 2C 23 42 EB 3B 90
88 15 AC 4C 84 FD 24 40 4F 08 C8 36 89 04 E4 5E
F1 AF CF FE 68 75 38 9C 75 0A 22 C2 44 49 35 A2

Если это имеет значение, то buf - это двоичный выход 512-битного шифрования RSA.

Я думал об использовании sprintf () для печати на символ [] в шестнадцатеричном формате, но я не могу заставить его работать правильно.

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Лучшим решением было бы написать HEX самостоятельно. Это не сложная задача, если вы используете справочную таблицу:

unsigned char buf[512];
char res[2048];
static const char* hex_lookup = "0123456789ABCDEF";
char *p = res;
for (int i = 0 ; i != 512 ; i++) {
    *p++ = hex_lookup[buf[i] >> 4];
    *p++ = hex_lookup[buf[i] & 0x0F];
    if ((i+1)%16) {
        *p++ = ' ';
    } else {
        *p++ = '\r';
        *p++ = '\n';
    }
}
*p = '\0';
2 голосов
/ 02 февраля 2012

Вы, похоже, не понимаете, что такое базы и типы хранилищ. char хранит только двоичные данные, все остальное - в том, как вы их интерпретируете.

Если вы пытаетесь сохранить представление ascii шестнадцатеричного числа в символе, вы можете сделать это просто, выполнив

#define TOHEX(c) ((c) > 9 ? (c) - 10 + 'a' : (c) + '0')
char high = TOHEX((c >> 4) & 0xf);
char low = TOHEX(c & 0xf);

Вам понадобится два символа для хранения каждого персонажа.

0 голосов
/ 02 февраля 2012

Вы можете использовать snprintf в цикле:

char* output = malloc(rsa.len * 3 + 1); // each number takes three characters to represent

char* cur = output;

for (i = 0; i < rsa.len; ++i)
    cur += snprintf(cur, sizeof(output) - (cur - output) - 1, "%02X%s", buf[i], (i + 1) % 16 ? " " : "\n");

// output is now a C-string holding 01 C2 etc

free(output);
...