我有一个正在运行的软件,目前运行在little-endian
架构上。我想让它在big-endian
模式下运行。无论底层系统的字节顺序如何,我都希望将little-endian
数据写入文件。
为实现这一目标,我决定使用boost endian库。它可以有效地转换整数。但它无法处理花车(和双打)。
在documentation中说明,Boost 1.59.0 "支持" 浮点类型。但1.62
仍然不支持它们。
我可以假设,浮点数有效IEEE 754
浮点数(或双精度数)。但是它们的字节顺序可能因底层系统而异。据我所知,不建议在浮点数上使用htonl
和ntohl
函数。那怎么可能呢?是否有任何标题库,它也可以处理浮点数?我找不到任何东西。
我可以将浮点数转换为字符串,并将其写入文件,我想避免使用该方法,原因很多(性能,磁盘空间......)
答案 0 :(得分:1)
Unheilig:你是对的,但是
C:\Users\your user name\
当你使用指针时,要立即倒车,请使用:
#include <boost/endian/conversion.hpp>
template <typename T>
inline T endian_cast(const T & t)
{
#ifdef BOOST_LITTLE_ENDIAN
return boost::endian::endian_reverse(t);
#else
return t;
#endif
}
并使用它,而不是手动(或可能容易出错)扭转它的内容
示例:
template <typename T>
inline T endian_cast(T *t)
{
#ifdef BOOST_LITTLE_ENDIAN
return boost::endian::endian_reverse_inplace(*t);
#else
return t;
#endif
}
祝你好运。
答案 1 :(得分:1)
序列化float / double值时,我做以下三个假设:
这些假设都不是标准所保证的。在这些假设下,以下代码将确保double是以little-endian编写的:
ostream out;
double someVal;
...
static_assert(sizeof(someVal) == sizeof(int64_t),
"Endian conversion requires 8-byte doubles");
native_to_little_inplace(reinterpret_cast<int64_t&>(someVal));
out.write(reinterpret_cast<char*>(&someVal), sizeof(someVal));
答案 2 :(得分:0)
下面:
float f = 1.2f;
auto it = reinterpret_cast<uint8_t*>(&f);
std::reverse(it, it + sizeof(f)); //f is now in the reversed endianness
不需要任何花哨的东西。