使用strtol()给出错误输出的十六进制字符串转换

问题描述:

我有一种情况,我需要将十六进制字符串0x8aaaf200转换为uint32_t。我首先在本地机器上测试了它(Linux Debian盒)。使用strtol()给出错误输出的十六进制字符串转换

// 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类型的用法,因为它是其他人编写的代码的一部分。

+1

在任何符合C99的编译器中,uint32_t'总是32位。但是正确的格式说明符是['PRIx32'](http://*.com/q/12936798/995714) –

+1

尝试在转换后测试'errno'的值,它可能会提供一些线索。 –

+0

@JoëlHechterrno说'Errno:数学结果不能代表' – Jake

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