【问题标题】:Hex string conversion using strtol() giving wrong output使用 strtol() 的十六进制字符串转换给出错误的输出
【发布时间】:2016-11-30 06:04:56
【问题描述】:

我有一种情况需要将十六进制字符串 0x8aaaf200 转换为 uint32_t。我首先在本地机器(Linux Debian box)上对其进行了测试。

// str contains "0x8aaaf200"

uint32_t var = (uint32_t)strtol(str, NULL, 0); 
printf("conversion: %x \n\n", var); // prints 8aaaf200

然后我在另一台机器(基于 Android)上运行它,但令我惊讶的是,输出结果是 7fffffff。我认为这可能与不同机器上的uint32_t 大小有关。

有人对如何修复它有建议吗?我无法更改 uin32_t 类型的用法,因为它是其他人编写的代码的一部分。

【问题讨论】:

  • uint32_t 在任何符合 C99 的编译器上始终为 32 位。但是它的正确格式说明符是PRIx32
  • 转换后尝试测试errno的值,可能会给出一些线索。
  • @JoëlHecht 错误状态 Errno: Math result not representable
  • 也许您的平台有 strtoul() 可用,如果有,请使用它。
  • @TonyB:那行得通。谢谢!

标签: c strtol


【解决方案1】:

您实际上将 LONG_MAX(即 2147483647 或 0x7FFFFFFF)作为返回值,当传递给 strtol 的值大于 LONG_MAX 时会发生这种情况。您应该使用无符号类型来表示您机器上的那个数字。请使用函数 strtoul() 代替 strtol。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2018-01-31
    • 2015-07-23
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多