将字节数组转换为普通旧C语言中的十六进制字符串
我正在研究一种将字节数组转换为十六进制字符串的方法,以下是我编写的代码:将字节数组转换为普通旧C语言中的十六进制字符串,c,C,我正在研究一种将字节数组转换为十六进制字符串的方法,以下是我编写的代码: unsigned char buffer[] = {0xAA,0xBB,0x01,0xAB,0x11,0x12,0x13,0x22,0x11,0x14}; int _tmain(int argc, _TCHAR* argv[]) { char * asta = (char*)malloc(16); memset(asta,0,16);
unsigned char buffer[] = {0xAA,0xBB,0x01,0xAB,0x11,0x12,0x13,0x22,0x11,0x14};
int _tmain(int argc, _TCHAR* argv[])
{
char * asta = (char*)malloc(16);
memset(asta,0,16);
int k;
for (k = 0; k < 16 ; k++)
{
sprintf(&asta[k],"%X",buffer[4 + k]);
}
printf("%s",asta);
_getch();
}
只有第一个字节被正确转换,其余的则没有。如何修复代码?您必须记住,当您将两位十六进制数字打印为字符串时,它仍然是两位数字,即它将占用两个字符 在循环中,第二次迭代将覆盖字符串的第二个字符,第三次迭代将覆盖第三个字符,以此类推 此外,由于每个两位数将使用两个字符,因此必须为32个字符分配内存,并为以“\0”结尾的字符串分配一个内存
如注释中所述,您正在访问数组之外的数据。您必须记住,当您将两位十六进制数字打印为字符串时,它仍然是两位数字,即它将占用两个字符 在循环中,第二次迭代将覆盖字符串的第二个字符,第三次迭代将覆盖第三个字符,以此类推 此外,由于每个两位数将使用两个字符,因此必须为32个字符分配内存,并为以“\0”结尾的字符串分配一个内存
正如注释中所指出的,您正在访问数组之外的数据。您的数组中有10个字节,因此您的缓冲区至少需要21个字节。空终止符的每个字节+1需要2个十六进制数字 我不明白你在这里干什么:
sprintf(&asta[k],"%X",buffer[4 + k]);
为什么要从缓冲区中的第五个字节开始?此外,缓冲区中的每个字节占用字符串中的两个字节,因此需要打印到asta[2*k]
把它们放在一起,你会得到如下结果:
char * asta = (char*)calloc(2 * sizeof buffer + 1, sizeof(char)); // calloc automatically zeros asta
int k;
for (k = 0; k < sizeof buffer ; k++)
{
sprintf(&asta[2 * k],"%02X", (unsigned int)buffer[k]); // Not sure if the cast is needed
}
printf("%s",asta);
数组中有10个字节,因此缓冲区至少需要21个字节。空终止符的每个字节+1需要2个十六进制数字 我不明白你在这里干什么:
sprintf(&asta[k],"%X",buffer[4 + k]);
为什么要从缓冲区中的第五个字节开始?此外,缓冲区中的每个字节占用字符串中的两个字节,因此需要打印到asta[2*k]
把它们放在一起,你会得到如下结果:
char * asta = (char*)calloc(2 * sizeof buffer + 1, sizeof(char)); // calloc automatically zeros asta
int k;
for (k = 0; k < sizeof buffer ; k++)
{
sprintf(&asta[2 * k],"%02X", (unsigned int)buffer[k]); // Not sure if the cast is needed
}
printf("%s",asta);
缓冲区只有10个元素,您访问超出范围。1。16字节不足以容纳10个十六进制数字;2.你永远不会释放记忆;3.每个十六进制数都需要2个字节。@DanielFischer由于其他原因,代码无法工作。如果您给我指出正确的方向,我将能够修改它。我不认为我使用sprintf很好!缓冲区只有10个元素,您访问超出范围。1。16字节不足以容纳10个十六进制数字;2.你永远不会释放记忆;3.每个十六进制数都需要2个字节。@DanielFischer由于其他原因,代码无法工作。如果您给我指出正确的方向,我将能够修改它。我不认为我使用sprintf很好!此外,他应该使用格式字符串%02X而不是%X进行转换,否则将有一些字节转换为只有一个数字的十六进制,这在您想再次从十六进制转换为二进制时是个问题。此外,他应该使用格式字符串%02X而不是%X进行转换,否则,将有一些字节转换为只有一个数字的十六进制,这将是一个问题,当你想从十六进制转换为二进制。