漫步不安全吗?
is strtoul not endian safe?
因此,我正在使用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
…
相关文章:
- C++/CLI 和 C#/VB 与不安全和外部有什么区别?
- 问:Apache Arrow 数组生成器不安全追加
- 不安全的 MPI 非阻塞通信示例?
- 有没有一种简单的方法来检查C++中的不安全表达式
- 为什么静态向下转换unique_ptr不安全?
- 哪些整数操作不安全
- 为什么这个递归 lambda 函数不安全?
- 解决方法:QPixmap:在GUI线程之外使用pixmap是不安全的
- 正在匹配不安全的正则线程
- 如何修复编译错误"此函数或变量可能不安全"(strcpy)
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 实现没有不安全服务器凭据的自定义 AuthMetadataProcessor
- 什么时候关闭__strict_ansi__标志是不安全的
- 原子对象在普通对象安全的任何上下文中都是不安全的
- OpenSSL:将不安全的BIO提升为安全
- 这是对支撑初始器列表的不安全使用情况
- 从 C# 到C++和返回的数组,没有不安全的代码
- 一个线程设置成员,而另一个循环上方 - 是此螺纹 - 不安全
- 访问"std::variant"的不安全、"noexcept"和无开销方式
- 漫步不安全吗?