我正在研究一种将字节数组转换为十六进制字符串的方法,这就是我编码的内容:
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();
}
只有第一个字节被正确转换,其余的不是。我该如何修复代码?
答案 0 :(得分:3)
您的数组中有10个字节,因此您的缓冲区至少需要21个字节(每个字节需要2个十六进制数字,空终止符需要1个)。
我不明白你在这做什么:
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);
答案 1 :(得分:1)
您必须记住,当您将其打印为字符串时,两位十六进制数字仍为两位数,即它将占用两个字符。
在循环中,第二次迭代将覆盖字符串的第二个字符,第三次迭代将覆盖第三个字符等。
此外,由于每个两位数字将使用两个字符,因此必须为32个字符分配内存, plus 一个用于终止'\0'
字符的字符串。
正如评论中所述,您正在访问阵列之外的数据。