2016-12-19 1 views
3

私は現時点ではlittle-endianアーキテクチャで動作する実用ソフトウェアを持っています。私はbig-endianモードでも動作させたいと思います。私は基礎となるシステムのエンディアンに関係なく、little-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:uはすぐに反転、使用に、ポインタを使用しているとき、あなたは正しいですが、

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

とそれを使用するのではなく、エラー - )を起こしやすい反転それはコンテンツだ

例:

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); 
} 

幸運。

関連する問題