C/C++ で、マルチバイト ワイド文字 (wchar_t) 値がビッグ エンディアン システムからリトル エンディアン システムに (またはその逆に) 送信される場合、反対側でも同じ値になりますか? それとも、バイトを交換する必要がありますか?
3 に答える
はい、それらを交換する必要があります。
バイトは、転送されたのと同じ順序でトランスポートから取得されます。ちょうど反対側では、これらのバイトの順序は異なる意味を持ちます。したがって、それらを正しいエンディアンネスに変換する必要があります (それは言葉ですか?)。
実証済みの方法は、転送前にネットワーク バイト オーダーに変換することです。次に、受信時に (ネットワーク バイト オーダーから) ホスト固有のバイト オーダーに変換します。
エンディアン変換に役立つ一連の関数:
ntohs Convert a 16-bit quantity from network byte order to host byte order
ntohl Convert a 32-bit quantity from network byte order to host byte order
htons Convert a 16-bit quantity from host byte order to network byte order
htonl Convert a 32-bit quantity from host byte order to network byte order
もう1つ注意事項を追加するだけです。
システムによって wchar_t のサイズが異なるため、sizeof(wchar_t) == 2 と想定しないでください。
さらに、各ホストは、wchar_t に対して異なる表現形式を使用する場合があります。
これに対処するために、ほとんどのシステムはテキストを転送用の既知の形式に変換します (UTF-8 または UTF-16 が適切な選択です)。もう一方の端で、テキストをホスト固有の形式に変換します。
IBM の icu を見ると、この機能がすべて備わっています。
エンディアン変換は十分ではないため、必要ありません。Sizeof(wchar_t) が異なるため、エンコーディングも異なります。したがって、交換フォーマットに同意する必要があります。論理的な選択は UTF-8 です。しかし、UTF-8 はバイト指向であるため、エンディアンの問題はもうありません。
はい、エンディアン変換を行う必要があります。シリアライゼーション形式、つまりネットワーク経由で送信されるデータやディスク ファイルに保存されるデータのバイト順を慎重に定義してください。次に、データを送信するときにネイティブからワイヤ形式に変換し (バイト スワップが必要な場合と不要な場合があります)、データを受信するときにワイヤ形式からネイティブ形式に変換します (これもバイト スワップが必要な場合と必要でない場合があります)。バイト スワッピングの平均量を最小限に抑えるために、大多数のクライアントで使用されるワイヤ形式を選択する必要があります。