6

Windows (リトル エンディアン) と Linux Embedded (ビッグ エンディアンとリトル エンディアン) の 3 つのハードウェア プラットフォームをサポートする必要があります。データ ストリームは使用するマシンに依存しており、データをビット フィールドに分割する必要があります。

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

ただし、Visual C++ のインクルードでこれを見つけることができません。

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

そうでない場合、バイトスワッピングを行うためにVisual C++で何を使用できますか(自分で書く以外に-マシンに最適化された組み込みを期待しています)?

ありがとう。

4

3 に答える 3

13

あなたが持っている両方のプラットフォームで

for short(16bit):htons()およびntohs()

for long(32bit):htonl()およびntohl()

行方不明のhtonll()ntohll()for long long(64bit) は、これら 2 つから簡単に構築できます。たとえば、この実装を参照してください。

更新-0:

上記のリンクの例では、Simon Richter がコメントで言及していますが、必ずしも機能する必要はありません。この理由は次のとおりです。コンパイラは、使用される共用体のどこかに余分なバイトを導入する可能性があります。これを回避するには、共用体をパックする必要があります。後者は、パフォーマンスの低下につながる可能性があります。

*llしたがって、関数を構築するための別のフェイルセーフアプローチは次のとおりです

更新-0.1:

bames53 のコメントから、上記でリンクされた最初の例は C++ では使用されず、C のみで使用されると結論付ける傾向があります。

更新-1:

*llLinuxで関数の機能を実現するには、このアプローチが「最適」かもしれません

于 2012-10-18T17:23:38.057 に答える
2

htons と htonl (および同様のマクロ) は、バイト セックスを処理する必要がある場合に適しています。

ただし、データを ASCII などで出力することにより、この問題を回避する方がはるかに優れています。もう少しスペースが必要で、ネット上での送信速度は少し遅くなりますが、単純さと将来性はそれだけの価値があります。

別のオプションは、int と short を数値的に分解することです。したがって、 & 0xff と 256 での除算を繰り返します。これにより、すべてのアーキテクチャで単一の形式が提供されます。しかし、ASCII の方がデバッグしやすいため、依然として優位性があります。

于 2012-10-18T21:24:20.820 に答える
2

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

編集: アーカイブされたリンク -> https://web.archive.org/web/20151207075029/http://msdn.microsoft.com/en-us/library/a3140177(v=vs.80).aspx

_byteswap_uint64、_byteswap_ulong、_byteswap_ushort

于 2012-10-18T17:23:54.283 に答える