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