C 将二进制字符[]转换为十六进制字符[]

C 将二进制字符[]转换为十六进制字符[],c,binary,hex,rsa,C,Binary,Hex,Rsa,我有一个包含二进制文本的无符号字符[]。我需要把这个二进制文本转换成十六进制。我已经设法做到了这一点,并将结果输出到一个文件中。但是,出于速度原因,我想直接将其输出到char[],以便进一步操作它。以下是写入文件的代码: for( i = 0; i < rsa.len; i++ ) fprintf( f, "%02X%s", buf[i], ( i + 1 ) % 16 == 0 ? "\r\n" : " " ); 文件的输出如下所示: 11 51 64 36

我有一个包含二进制文本的无符号字符[]。我需要把这个二进制文本转换成十六进制。我已经设法做到了这一点,并将结果输出到一个文件中。但是,出于速度原因,我想直接将其输出到char[],以便进一步操作它。以下是写入文件的代码:

for( i = 0; i < rsa.len; i++ )
fprintf( f, "%02X%s", buf[i],
             ( i + 1 ) % 16 == 0 ? "\r\n" : " " );
文件的输出如下所示:

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[],但似乎无法使其正常工作

您可以在循环中使用
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);
char*output=malloc(rsa.len*3+1);//每个数字用三个字符表示
char*cur=输出;
对于(i=0;i
您似乎对基本类型和存储类型感到困惑。
char
只存储二进制数据,其他一切都取决于您如何解释它

如果您试图将十六进制数的ascii表示形式存储在一个字符中,那么您可以直接通过

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

您需要两个字符来存储每个字符。

最好的解决方案是自己编写十六进制。如果使用查找表,这不是一项困难的任务:

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';

你在上一段提到的尝试中尝试了什么?您为目的地预留了多少空间?非常好的解决方案谢谢您的帮助!我现在意识到我的sprintf问题被忽略了,分配给我的二进制数组大小的4倍。不过,这个解决方案要好得多!是的,绝对是。编辑以修复。
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';