1

我正在研究一种将字节数组转换为十六进制字符串的方法,这是我编写的代码:

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();
}

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

4

2 回答 2

4

您的数组中有 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);
于 2012-06-18T11:15:38.930 回答
1

您必须记住,当您将其打印为字符串时,两位十六进制数字仍然是两位数,即它将占用两个字符。

在循环中,第二次迭代将覆盖字符串的第二个字符,第三次迭代将覆盖第三个字符,依此类推。

此外,由于每个两位数将使用两个字符,因此您必须为 32 个字符分配内存,再加上一个用于字符串终止'\0'字符。

正如评论中所指出的,您正在访问数组之外​​的数据。

于 2012-06-18T11:09:56.240 回答