Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字节数组转换为普通旧C语言中的十六进制字符串_C - Fatal编程技术网

将字节数组转换为普通旧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进行转换,否则,将有一些字节转换为只有一个数字的十六进制,这将是一个问题,当你想从十六进制转换为二进制。