有效地在little-endian和big-endian浮点之间进行转换

时间:2016-12-19 10:36:39

标签: c++ boost endianness

我有一个正在运行的软件,目前运行在little-endian架构上。我想让它在big-endian模式下运行。无论底层系统的字节顺序如何,我都希望将little-endian数据写入文件。

为实现这一目标,我决定使用boost endian库。它可以有效地转换整数。但它无法处理花车(和双打)。

documentation中说明,Boost 1.59.0 "支持" 浮点类型。但1.62仍然不支持它们。

我可以假设,浮点数有效IEEE 754浮点数(或双精度数)。但是它们的字节顺序可能因底层系统而异。据我所知,不建议在浮点数上使用htonlntohl函数。那怎么可能呢?是否有任何标题库,它也可以处理浮点数?我找不到任何东西。

我可以将浮点数转换为字符串,并将其写入文件,我想避免使用该方法,原因很多(性能,磁盘空间......)

3 个答案:

答案 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值时,我做以下三个假设:

  1. 机器表示遵循IEEE 754
  2. float / double的字节序与整数的字节序
  3. double&/ int64_t&或float&/ int32_t&之间的reinterpret_cast-ing行为是明确定义的(例如,强制转换的行为就像类型相似)。

这些假设都不是标准所保证的。在这些假设下,以下代码将确保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

不需要任何花哨的东西。