2016-12-19 54 views
3

我有一個工作軟件,目前運行在little-endian體系結構。我也想讓它在big-endian模式下運行。我希望將little-endian數據寫入文件,而不管底層系統的字節順序如何。轉換小端和大端浮點有效

爲了達到這個目的,我決定使用boost endian庫。它可以有效地轉換整數。但它無法處理浮動(和雙打)。

它在documentation中聲明:「浮點類型將在Boost 1.59.0中受支持」。但是他們仍然不支持1.62

我可以假設,浮游物是有效的IEEE 754浮游物(或雙打)。但是它們的排列順序可能根據底層系統而有所不同。據我所知,不建議在浮點數上使用htonlntohl函數。那怎麼可能呢?有沒有任何只有標題的庫,它也可以處理浮游物?我無法找到任何。

我可以在花車轉換爲字符串,並編寫成一個文件,我想避免的方法,原因是多方面的(性能,磁盤空間,...)

+0

不需要任何lib,它非常直接。看看那裏:http://stackoverflow.com/questions/2782725/converting-float-values-from-big-endian-to-little-endian – aCOSwt

回答

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 

不需要任何花哨。

0

Unheilig:你是正確的,但

#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 
} 

或當u使用指針,要立即倒車,用途:

template <typename T> 
inline T endian_cast(T *t) 
{ 
#ifdef BOOST_LITTLE_ENDIAN 
    return boost::endian::endian_reverse_inplace(*t); 
#else 
    return t; 
#endif 
} 

,並使用它,而不是手動(或可能無差錯易)扭轉它的內容

例如:

std::uint16_t start_address() const 
{ 
    std::uint16_t address; 
    std::memcpy(&address, &data()[1], 2); 
    return endian_cast(address); 
} 
void start_address(std::uint16_t i) 
{ 
    endian_cast(&i); 
    std::memcpy(&data()[1], &i, 2); 
} 

祝你好運。