漫步不安全吗?

is strtoul not endian safe?

本文关键字:不安全 漫步      更新时间:2023-10-16

因此,我正在使用strtoul在小端序和大端序机器上从字符串转换为unsigned long。小端序机器返回正确的值,而大端序机器没有。这个功能真的不能在大端机器上兼容吗?如果是这样,有没有解决办法?

代码:

printf ("%sn",cLongs);
theLongs[i] = strtoul(cLongs, NULL, 10);
cout << "returned unsigned long value from string: " << theLongs[i] << endl;

小端结果:

1099188638048931
returned unsigned long value from string: 1099188638048931

大端结果:

1099188638048931
returned unsigned long value from string: 4294967295

注:对于大端序的例子,似乎总是返回相同的数字。

strtoul返回ULONG_MAX溢出。这就是你打的地方。我假设一个在32位上运行,另一个在64位上运行。4294967295 == 0xFFFFFFFF,对于32位机器将是ULONG_MAX


尝试以下操作是否在两个系统上都适用。到目前为止,我只能在64位Little Endian Linux上进行测试。如果是这样,可以使用字符串流进行转换(这是c++的风格):

#include <iostream>
#include <sstream>
int main()
{
  using namespace std;
  string sval("1099188638048931"); // your huge value, exceeding 32bit
  istringstream sst(sval); // assign string to a stream
  unsigned long long myval;
  sst >> myval; // convert stream to unsigned 64bit integer
  cout << myval << endl; // output the converted result
  return 0;
}

注意,unsigned long long必须是带有MSVC的unsigned __int64。其他编译器可能也有其他名称。如果你足够幸运,你将拥有所有平台上的标准类型,并且可以使用uint64_t