将二进制char []转换为十六进制char []

时间:2012-02-02 02:56:06

标签: c binary hex rsa

我有包含二进制文本的unsigned char []。我需要将这个二进制文本转换为十六进制。我已设法做到这一点并将结果输出到文件。但是,出于速度原因,我想直接将其输出到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()以十六进制打印到char [],但我似乎无法让它正常工作。

3 个答案:

答案 0 :(得分:3)

性能最佳的解决方案是自己编写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';

答案 1 :(得分:2)

您似乎对基础和存储类型感到困惑。 char仅存储二进制数据,其他所有内容都与您解释它有关。

如果您要做的是将十六进制数字的ascii表示存储在char中,您可以通过执行

直接执行此操作
#define TOHEX(c) ((c) > 9 ? (c) - 10 + 'a' : (c) + '0')
char high = TOHEX((c >> 4) & 0xf);
char low = TOHEX(c & 0xf);

你需要两个字符来存储每个角色。

答案 2 :(得分:0)

您可以在循环中使用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);