查看后this问题我没有找到所需的解决方案,因此我尝试按以下方式使用 strtol
:
in = (unsigned char *)malloc(16);
for(size_t i = 0; i < (size_t)strlen(argv[2]) / 2; i+=2 )
{
long tmp = 0;
tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16);
memcpy(&in[i], &tmp, 1);
}
这段代码产生了几个中间值:
有人可以解释一下为什么整个in
数组被0xFF
(255)字节填充以及为什么tmp
不等于它的估计值?
也欢迎有关如何改进上述代码以使用正确的十六进制值填充 in
数组的提示。
最佳答案
您的代码多次计数都是错误的,并且强制转换隐藏了问题:
转换malloc
的返回值在 C 中不是必需的,如果您忘记包含 <stdlib.h>
,则可能会隐藏不安全的转换。 :
in = (unsigned char *)malloc(16);
转换strlen
的返回值至(size_t)
是无用的,甚至是多余的,如 strlen
定义为返回 size_t
。您可能再次忘记包含 <string.h>
...
for (size_t i = 0; i < (size_t)strlen(argv[2]) / 2; i += 2) {
long tmp = 0;
strtol
接受一个指向 char
的 const 指针,其中argv[2] + i
将隐式转换为。 Actor 阵容(const char*)
是没用的。第二个参数是 char*
的地址。您传递 argv
的第五个元素的地址,换句话说&argv[4]
,最肯定不是您打算做的事情,尽管您的循环的目的相当模糊......
tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16);
复制tmp
中的长值与 memcpy
需要复制sizeof(tmp)
字节。复制第一个字节仅具有实现定义的效果,具体取决于 char
的大小以及目标系统的字节顺序:
memcpy(&in[i], &tmp, 1);
}
您应该发布一个完整的可编译示例来说明您的问题,代码片段缺少重要的上下文信息,例如包含哪些头文件、如何定义变量以及在片段之前执行哪些代码。
正如所写,您的代码没有多大意义,尝试解释其行为是没有意义的。
关于引用中的问题,您的代码甚至没有远程提供将十六进制字符字符串转换为字节数组的解决方案。
关于c - 字符串转换时 strtol 结果不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37092863/