2012-10-18 17 views
5

Windows(リトルエンディアン)とLinuxエンベデッド(エンディアンの大小)という3つのハードウェアプラットフォームをサポートする必要があります。私たちのデータストリームは使用するマシンに依存し、データはビットフィールドに分割する必要があります。バイトオーダーのビッグエンディアンとリトルエンディアンのサポート

詳細を抽象化するために、可能であれば単一のマクロを記述したいと思います。 Linuxでは、リトルエンディアンの変換には/bswap_32/bswap_64を使用できます。

しかし、これは私のVisual C++には見つかりません。

両方のプラットフォーム(WindowsおよびLinux)用の汎用ビルトインはありますか?

もしそうでなければ、バイトスワップを行うためにVisual C++で何が使えますか?

ありがとうございました。あなたがshortため

を持って、両方のプラットフォームで

答えて

12

(16ビット):longためhtons()ntohs()

(32ビット):htonl()ntohl()

行方不明htonll()long longためntohll()(64ビット)ができそれらの2つから簡単に構築することができます。 this implementation for exampleを参照してください。

更新-0:

サイモン・リヒターの上にリンクされ例えば、それは必ずしも動作するように持っていることを、コメントで言及しています。この理由は次のとおりです。コンパイラは、使用される共用体のどこかに余分なバイトを導入する可能性があります。これを回避するには、労働組合を詰める必要があります。後者はパフォーマンスの低下につながる可能性があります。私は上記のリンク第一の例を締結する傾向にあるコメントを使用してはならないbames53さんから

https://stackoverflow.com/a/955980/694576

更新-0.1:だからここ

*ll機能を構築するための別のフェイルセーフ的なアプローチですC++を使用していますが、Cのみを使用しています。

アップデート-1:

のLinux this approach might be the ' best'*ll機能のfunctionallityを達成するために。

+0

これらの機能は、ネットワーク(インターネットなど)を理解するすべてのOSにとって比較的普遍的です。最も最近のOS –

+0

'union 'を使った実装例は動作することが保証されていないことに注意してください。 –

+0

はい、組合を梱包するのが正しいです。これを指摘してくれてありがとう。私の答えの更新を見てください。 @SimonRichter – alk

2

同じ名前ではありませんが、同じ機能はexistです。

2

バイトセックスを主張する場合は、htonsとhtonl(および類似のマクロ)が適しています。

ただし、データをASCIIなどで出力することで問題を回避する方がはるかに優れています。それは少し余裕があり、ネットを少しゆっくりと送信しますが、シンプルさと将来の防御はその価値があります。

もう1つの方法は、intとshortを数値的に分割することです。だから& 0xffを繰り返し、256で割ります。これにより、すべてのアーキテクチャで単一のフォーマットが得られます。しかし、ASCIIでデバッグするのは簡単であるため、依然としてASCIIがあります。

+0

それをしたいですが、私たちは送信を制御しません。特別なハードウェアデバイスから読み込まれたデータであり、そこからバイトを処理する必要があります。 – user626201

関連する問題