如何将字符串十进制转换为十六进制十进制并将它们添加到 char 指针?为什么 memcpy(value + 2, &value_value, value_length);
不起作用,结果是 0x02 0x01
而不是 0x02 0x01 0x4f
。
#include <string.h> /* strlen */
#include <stdio.h> /* printf */
#include <stdint.h> /* int32_t */
#include <stdlib.h> /* strtol */
int main()
{
char value_type = 0x02;
char *value_value = "79"; /* Must convert to 4f */
char value_length;
int32_t num = strtol(value_value, NULL, 10);
if (num < 255)
value_length = 0x01;
else if (num < 65536)
value_length = 0x02;
else if (num < 16777216)
value_length = 0x03;
else if (num < 4294967295)
value_length = 0x04;
char *value = malloc(2 + value_length);
memcpy(value, &value_type, 1);
memcpy(value + 1, &value_length, 1);
memcpy(value + 2, &value_value, value_length);
/* expectation: 0x02 0x01 0x4f */
for (int i = 0; i < strlen(value); i++)
printf("%02x\n", value[i]);
return 0;
}
最佳答案
memcpy(value + 2, &value_value, value_length);
此表达式从 &value_value
复制 value_length
个字节。
鉴于它被声明为
char *value_value
&value_value
被读取为指向字符的指针
。因此,您正在有效地读取指针值。
如何解决:
memcpy(value + 2, &num, value_length);
您的代码的另一个问题:
您正在使用 strlen(value)
,而 value
不是以 null 结尾的 C 字符串。它只是一个用数据填充的字节数组。
如何修复:
在这种情况下不要使用strlen
,您知道数组的大小:2 + value_length
。为了清楚起见,您可以将其放入单独的变量中。
关于将字符串十进制转换为十六进制十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46107991/