从C中的十六进制字符串创建字节数组[重复]

问题描述 投票:0回答:1

此问题已经在这里有了答案:

我已经搜索了Stackoverflow,并且有很多答案-但不是针对我所看到的确切问题(如果在macOS上使用gcc,如果有所不同-特定于Mac的建议将不会执行,因为我需要这样做跨平台)。我知道如何将字符串转换为十六进制到缓冲区-至少,我以为是这样。我是这样的:

unsigned char* buffer_from_hexstring(char* string) {
    unsigned char* HexBuffer = (unsigned char *)malloc( (strlen(string) / 2) * sizeof(unsigned char) );

    for (size_t count = 0; count < strlen(string); count++) {
        sscanf(string, "%2hhx", &HexBuffer[count]);
        string += 2;
    }

    return HexBuffer;
}

我按如下方式调用我的函数:

int main(int argc, char *argv[]) {
    char* hexstring = "beefcafebeefcafebeefcafe";

    unsigned char* buffer = buffer_from_hexstring(hexstring);

    printf("Result: ");
    for(size_t count = 0; count < (sizeof(buffer) * sizeof(*buffer)); count++) {
        printf("%02x", buffer[count]);
    }

    free(buffer);
}

我得到的结果是beefcafebeefcafe。我想吃牛肉咖啡。实际上,无论我做什么,我只能得到16字节的数据-如果我想转换更多的字节,这是没有用的。

我确定这是一个明显的错误-但我看不到它。可以吗?

c
1个回答
0
投票

一个问题是循环

for (size_t count = 0; count < strlen(string); count++)

迭代字符串string中的all个字符,但是在循环中,您一次“提取”了两个字符。

一个简单的解决方案是遍历half的长度,因为提取的每个十六进制数字都是两位数:

for (size_t count = 0; count < strlen(string) / 2; count++)

[HexBuffer分配内存时,您也会犯同样的错误,所分配的内存是所需数量的两倍。

使用返回的指针打印值时,您也需要考虑到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.