Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 斯特图尔不安全吗?_C++_Endianness_String Conversion - Fatal编程技术网

C++ 斯特图尔不安全吗?

C++ 斯特图尔不安全吗?,c++,endianness,string-conversion,C++,Endianness,String Conversion,因此,我在一台小端和大端机器上使用strtoul实现从字符串到无符号long的转换。小端机器返回正确的值,而大端机器不返回。这个函数真的在big-endian机器上不兼容吗?如果是,是否有解决办法 代码: 大端结果: 1099188638048931 returned unsigned long value from string: 1099188638048931 1099188638048931 returned unsigned long value from string: 42949

因此,我在一台小端和大端机器上使用strtoul实现从字符串到无符号long的转换。小端机器返回正确的值,而大端机器不返回。这个函数真的在big-endian机器上不兼容吗?如果是,是否有解决办法

代码:

大端结果:

1099188638048931
returned unsigned long value from string: 1099188638048931
1099188638048931
returned unsigned long value from string: 4294967295

另外,对于Big-endian示例,似乎总是返回相同的数字。

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


尝试以下两种系统是否都适用。到目前为止,我只能在64位的小Endian Linux上测试它。如果是这样,可以使用字符串流进行转换(这无论如何是C++样式来做的事情):

#包括
#包括
int main()
{
使用名称空间std;
字符串sval(“1099188638048931”);//您的巨大值,超过32位
istringstream sst(sval);//为流分配字符串
无符号长myval;
sst>>myval;//将流转换为无符号64位整数

在尝试一个更小的未签名的int之后,这个问题似乎是正确的答案。有没有办法解决这个问题,或者我是不是困在一个岩石和一个硬的地方?”杰夫:我很确定没有跨平台的解决方案,因为这将超出C标准。但是,代替C运行时,你可以使用C++字符串流和
@Jeff:查看您的系统是否在BSD上有
strtoull
strtouq
),它使用了
未签名的long-long
——可能两个都是64位。@STATUS\u ACCESS\u DENIED和@TONY:感谢您的帮助,未签名的long-long似乎可以工作,但我必须看看它是否可以用于我的应用程序。我正在做一个网络项目,这些未签名的long-long是使用blowfish对消息进行加密的一部分。我要看看如果我能让该算法与无符号long-long一起工作。如果我在64位端使用无符号long,在32位端使用无符号long-long,那么位移位会正常工作吗?(当然会注意endian问题)@Jeff:你能告诉我们,它是否适用于你的示例代码吗?
1099188638048931
returned unsigned long value from string: 4294967295
#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;
}