wchar_tデータにはエンディアン変換が必要ですか?
-
05-07-2019 - |
質問
C / C ++では、マルチバイトワイド文字(wchar_t)値がビッグエンディアンシステムからリトルエンディアンシステム(またはその逆)に送信されると、他のシステムで同じ値が出力されます側?または、バイトを交換する必要がありますか?
解決
はい、それらを交換する必要があります。
バイトは、入れられたのと同じ順序でトランスポートから取得されます。反対側では、これらのバイトの順序は異なる意味を持ちます。したがって、それらを正しいエンディアンに変換する必要があります(それは単語ですか?)。
実証済みの方法は、トランスポートの前にネットワークバイト順に変換することです。次に、受信時に(ネットワークバイト順から)ホスト固有のバイト順に変換します。
エンディアン変換を支援する一連の関数:
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
注意事項を追加します。
システムによってwchar_tのサイズが異なるため、sizeof(wchar_t)== 2を想定しないでください。
さらに、各ホストはwchar_tに異なる表現形式を使用できます。
これに対処するために、ほとんどのシステムはテキストをトランスポート用の既知の形式に変換します(UTF-8またはUTF-16が適切な選択です)。反対側でホスト固有の形式にテキストを変換します。
このすべての機能を備えたIBMのicuを見ることができます。
他のヒント
エンディアン変換は十分ではなく、結果として必要ありません。 Sizeof(wchar_t)は異なるため、エンコードも異なります。したがって、交換フォーマットに同意する必要があります。論理的な選択はUTF-8です。しかし、UTF-8はバイト指向であるため、エンディアンネスの問題はもうありません。
はい、エンディアン変換を実行する必要があります。シリアル化形式、つまりネットワーク経由で送信されるデータまたはディスクファイルに保存されるデータのバイト順を慎重に定義します。次に、データを送信するときは、ネイティブからワイヤ形式に変換します(バイトスワップが必要な場合と必要ない場合があります)。バイトスワッピングの平均量を最小限に抑えるために、大半のクライアントで使用されるワイヤー形式を選択する必要があります。