此问题已经在这里有了答案:
我已经搜索了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字节的数据-如果我想转换更多的字节,这是没有用的。
我确定这是一个明显的错误-但我看不到它。可以吗?
一个问题是循环
for (size_t count = 0; count < strlen(string); count++)
迭代字符串string
中的all个字符,但是在循环中,您一次“提取”了两个字符。
一个简单的解决方案是遍历half的长度,因为提取的每个十六进制数字都是两位数:
for (size_t count = 0; count < strlen(string) / 2; count++)
[HexBuffer
分配内存时,您也会犯同样的错误,所分配的内存是所需数量的两倍。
使用返回的指针打印值时,您也需要考虑到这一点。