如何存储双重独立
How to store double - endian independent
尽管大型计算机不是很广泛地使用,但我想以独立格式存储双重数据类型。
对于int,这真的很简单,因为位移位使得非常方便。
int number;
int size=sizeof(number);
char bytes[size];
for (int i=0; i<size; ++i)
bytes[size-1-i] = (number >> 8*i) & 0xFF;
此代码SNIPET以大型Endian格式存储该数字,尽管它正在使用它。最优雅的方法用于双重?
可移植性和考虑格式的最佳方法是分别序列化/划分曼蒂萨(Mantissa)和指数。为此,您可以使用frexp()/ldexp()函数。
例如,序列化:
int exp;
unsigned long long mant;
mant = (unsigned long long)(ULLONG_MAX * frexp(number, &exp));
// then serialize exp and mant.
,然后进行挑选:
// deserialize to exp and mant.
double result = ldexp ((double)mant / ULLONG_MAX, exp);
优雅的事情是限制尽可能小的范围。狭窄的范围是您的计划与外界之间的I/O边界。例如,从其他应用程序中将二进制数据发送到/接收二进制数据的函数需要意识到endian问题,将二进制数据写入/读取/读取某些数据文件的二进制数据的功能也是如此。使这些接口认识到表示问题。
使其他所有事物都充满幸福的是问题。在其他任何地方使用本地代表。表示双精度浮点数为double
,而不是8个字节的数组,代表一个32位整数作为int
或int32_t
,而不是4个字节等数组等。在整个代码中处理Endianness问题将使您的代码肿,易行和丑陋。
相同。任何数字对象,包括双重对象,最终都是几个字节,这些字节根据Endianness以特定的顺序进行解释。因此,如果恢复字节的顺序,您将在反向的端度中获得完全相同的值。
char *src_data;
char *dst_data;
for (i=0;i<N*sizeof(double);i++) *dst_data++=src_data[i ^ mask];
// where mask = 7, if native == low endian
// mask = 0, if native = big_endian
优雅在于 mask
中,处理也短而整数类型:如果目标和源末端不同。
不是很便携,标准违反,但是类似的东西:
std::array<unsigned char, 8> serialize_double( double const* d )
{
std::array<unsigned char, 8> retval;
char const* begin = reinterpret_cast<char const*>(d);
char const* end = begin + sizeof(double);
union
{
uint8 i8s[8];
uint16 i16s[4];
uint32 i32s[2];
uint64 i64s;
} u;
u.i64s = 0x0001020304050607ull; // one byte order
// u.i64s = 0x0706050403020100ull; // the other byte order
for (size_t index = 0; index < 8; ++index)
{
retval[ u.i8s[index] ] = begin[index];
}
return retval;
}
可能会处理一个带有8位字符,8个字节双打和任何疯狂的字节订购的平台(即,单词中的大末日,但在单词之间以64位值的单词为单词)。
现在,这并不涵盖双打的最终性与64位Ints不同。
一种更容易的方法可能是将双重命中率投为64位未签名的值,然后输出与任何其他Int一样
void reverse_endian(double number, char (&bytes)[sizeof(double)])
{
const int size=sizeof(number);
memcpy(bytes, &number, size);
for (int i=0; i<size/2; ++i)
std::swap(bytes[i], bytes[size-i-1]);
}
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 使用QProcess执行命令,并将结果存储在QStringList中
- 独立读取-修改-写入顺序
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- 原子功能无锁可以更改两个独立的存储位置
- 如何存储双重独立
- 在C++中将一个数组中的两个独立值存储到单个数组索引中