c - 字符串转换时 strtol 结果不匹配

标签 c arrays string hex strtol

查看后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);
}

这段代码产生了几个中间值:

Watches of local variables

有人可以解释一下为什么整个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/

相关文章:

c 排序大型结构数组并打印到屏幕

c# - 如何解析 xml 并从字符串中循环遍历它?

python - 获取数组平均值的更多 pythonian 方法

c - 将数组附加到共享内存

c - 分隔字符中的两个值并将它们分配给变量

c - 将系统调用添加到 linux 内核

javascript - 使用 JavaScript 进行功能分配?

Python 切片字符串或添加到列表列表中的字符串

string - 如何比较忽略大小写的字符串?

C/C++ 预处理二义性