GNU/Linux >> Linux の 問題 >  >> Linux

バイト順のビッグ エンディアンとリトル エンディアンのサポート

お持ちの両方のプラットフォームで

short の場合 (16bit):htons() そして ntohs()

long の場合 (32bit):htonl() および ntohl()

欠けている htonll() そして ntohll() long long の場合 (64ビット)は、これら2つから簡単に構築できます。たとえば、この実装を参照してください。

更新-0:

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

*ll をビルドするためのもう 1 つのフェイルセーフ アプローチを次に示します。 関数:https://stackoverflow.com/a/955980/694576

更新-0.1:

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

更新-1:

*ll の機能を実現するには


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

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

_byteswap_uint64、_byteswap_ulong、_byteswap_ushort


バイト セックスを扱いたい場合は、htons と htonl (および同様のマクロ) が適しています。

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

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


Linux
  1. BashForループガイドと例

  2. プロのヒント:For、While、Untilループ

  3. Getopt、Getopts、または手動解析–短いオプションと長いオプションの両方をサポートしたい場合は何を使用しますか?

  1. Linux – Ipv6対応の一般的なLinuxサポート?

  2. C の GDB ブレークポイントの例 – ブレークポイントの設定、表示、継続、および削除

  3. コマンドと出力の異なる色

  1. 自動化のためにAnsibleとanacronを使用する方法

  2. RedHatとSUSEがOpenLDAPのサポートを撤回すると発表

  3. curlとwgetのヒントとコツ