在普通旧C中将字节数组转换为十六进制字符串

时间:2012-06-18 10:58:51

标签: 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);
                int k;
                for (k = 0; k < 16 ; k++)
                {
                    sprintf(&asta[k],"%X",buffer[4 + k]);
                }

                printf("%s",asta);

    _getch();
}

只有第一个字节被正确转换,其余的不是。我该如何修复代码?

2 个答案:

答案 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'字符的字符串。

正如评论中所述,您正在访问阵列之外的数据。