【问题标题】:strtol result mismatch while string conversion字符串转换时strtol结果不匹配
【发布时间】:2016-05-07 19:33:36
【问题描述】:

查看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 数组的提示。

【问题讨论】:

  • 去掉演员表。 (unsigned char *) 是不必要的。 (size_t) 是不必要的,因为 strlen() 的返回类型已经是 size_t。而(const char *)argv[2] + i, &amp;argv[2] + 2 是错误的。
  • strtol 的第二个参数完全错误 - 与输入字符串无关。我建议你的循环应该是strlen(...) 而不是strlen(...)/2,如果你打算尝试多次转换输入字符串,跳过第一对,下一对等十六进制数字。

标签: c arrays string hex strtol


【解决方案1】:

您的代码多次计数错误,并且演员表隐藏了问题:

在 C 中没有必要强制转换 malloc 的返回值,如果您忘记包含 &lt;stdlib.h&gt;,可能会隐藏不安全的转换:

in = (unsigned char *)malloc(16);

strlen 的返回值转换为(size_t) 是没有用的,甚至是多余的,因为strlen 被定义为返回size_t。同样,您可能忘记包含 &lt;string.h&gt;...

for (size_t i = 0; i < (size_t)strlen(argv[2]) / 2; i += 2) {
    long tmp = 0;

strtol 接受一个指向char 的常量指针,argv[2] + i 将隐式转换为该指针。演员(const char*) 没用。第二个参数是char* 的地址。你传递了argv 的第五个元素的地址,也就是&amp;argv[4],虽然你的循环的目的很模糊......

    tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16);

memcpy 复制tmp 中的长值将需要复制sizeof(tmp) 字节。复制 first 字节仅具有实现定义的效果,具体取决于 char 的大小和目标系统的字节序:

    memcpy(&in[i], &tmp, 1);
}

您应该发布一个完整的可编译示例来说明您的问题,代码片段缺少重要的上下文信息,例如包含哪些头文件、如何定义变量以及在片段之前执行了哪些代码。

正如所写,你的代码没有多大意义,试图解释它的行为是没有意义的。

关于参考中的问题,您的代码甚至没有远程提供将十六进制字符串转换为字节数组的解决方案。

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多