お持ちの両方のプラットフォームで
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 の方がデバッグしやすいため、依然として優位性があります。