使用 strtol() 的十六进制字符串转换给出错误的输出
Hex string conversion using strtol() giving wrong output
我有一种情况需要将十六进制字符串 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
类型的用法,因为它是其他人编写的代码的一部分。
您实际上得到 LONG_MAX(即 2147483647 或 0x7FFFFFFF)作为 return 值,当传递给 strtol 的值大于 LONG_MAX 时会发生这种情况。您应该在您的机器上使用无符号类型来表示该数字。请使用函数 strtoul() 代替 strtol。
我有一种情况需要将十六进制字符串 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
类型的用法,因为它是其他人编写的代码的一部分。
您实际上得到 LONG_MAX(即 2147483647 或 0x7FFFFFFF)作为 return 值,当传递给 strtol 的值大于 LONG_MAX 时会发生这种情况。您应该在您的机器上使用无符号类型来表示该数字。请使用函数 strtoul() 代替 strtol。