ビッグエンディアンとリトルエンディアンのバイト順序の違いは何ですか?
これらは両方ともUnicodeとUTF16に関連しているようです。これはどこで正確に使用しますか?
ビッグエンディアンとリトルエンディアンのバイト順序の違いは何ですか?
これらは両方ともUnicodeとUTF16に関連しているようです。これはどこで正確に使用しますか?
ビッグ エンディアン (BE) / リトル エンディアン (LE) は、マルチバイト ワードを編成する 2 つの方法です。たとえば、2 バイトを使用して UTF-16 で文字を表す場合、0x1234
文字をバイトの文字列 (0x00-0xFF) として表す方法は 2 つあります。
Byte Index: 0 1
---------------------
Big-Endian: 12 34
Little-Endian: 34 12
テキストが UTF-16BE と UTF-16LE のどちらを使用しているかを判断するために、仕様では文字 U+FEFF を表すバイト オーダー マーク(BOM) を文字列の先頭に追加することを推奨しています。したがって、UTF-16 でエンコードされたテキスト ファイルの最初の 2 バイトが , の場合FE
、FF
エンコードは UTF-16BE です。FF
、についてはFE
、UTF-16LEです。
視覚的な例: さまざまなエンコーディング (BOM 付きの UTF-16) での "Example" という単語:
Byte Index: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
------------------------------------------------------------
ASCII: 45 78 61 6d 70 6c 65
UTF-16BE: FE FF 00 45 00 78 00 61 00 6d 00 70 00 6c 00 65
UTF-16LE: FF FE 45 00 78 00 61 00 6d 00 70 00 6c 00 65 00
詳細については、Wikipedia のEndiannessおよび/またはUTF-16のページを参照してください。
フェルディナンドの答え(およびその他)は正しいですが、不完全です。
ビッグ エンディアン (BE) / リトル エンディアン (LE) は、UTF-16 または UTF-32 とは関係ありません。これらは Unicode よりもずっと前から存在し、数値のバイトがコンピューターのメモリに格納される方法に影響を与えます。それらはプロセッサに依存します。
値を持つ数値がある場合0x12345678
、メモリ内では12 34 56 78
(BE) または78 56 34 12
(LE) として表されます。
UTF-16 と UTF-32 はたまたま 2 バイトと 4 バイトで表現されるため、バイトの順序は、そのプラットフォームで任意の数値が従う順序を尊重します。
UTF-16 は Unicode を 16 ビット値にエンコードします。最新のファイルシステムのほとんどは、8 ビット バイトで動作します。たとえば、UTF-16 でエンコードされたファイルをディスクに保存するには、16 ビット値のどの部分を最初のバイトに入れ、どの部分を 2 番目のバイトに入れるかを決定する必要があります。
ウィキペディアには、より完全な説明があります。
リトルエンディアン: adj.
与えられた 16 ビットまたは 32 ビットのワード内で、下位アドレスのバイトの重要度が低くなる (ワードは「little-end-first」で格納される) コンピューター アーキテクチャを表します。PDP-11 および VAX ファミリのコンピュータと Intel マイクロプロセッサ、および多くの通信およびネットワーク ハードウェアはリトルエンディアンです。この用語は、バイト以外の単位の順序を説明するために使用されることがあります。ほとんどの場合、バイト内のビット。
ビッグエンディアン: adj.
[一般; 1980 年 4 月 1 日付 USC/ISI IEN 137、Danny Cohen による有名な論文 On Holy Wars and a Plea for Peace による Swift の Gulliver's Travels より]
特定のマルチバイト数値表現内で、最上位バイトが最下位アドレスを持つコンピューター アーキテクチャを記述します (単語は「big-end-first」で格納されます)。IBM 370 ファミリ、PDP-10、Motorola マイクロプロセッサ ファミリ、およびさまざまな RISC 設計のほとんどを含むほとんどのプロセッサは、ビッグ エンディアンです。ビッグ エンディアンのバイト オーダーは、ネットワーク オーダーと呼ばれることもあります。
---専門用語ファイルから: http://catb.org/~esr/jargon/html/index.html
ビッグ エンディアンとリトル エンディアンは、一連のバイトがコンピュータ メモリに格納される順序を表す用語です。
例えば
ビッグ エンディアンのコンピューターでは、16 進数に必要な 2 バイトがストレージ4F52
に格納されます。4F52
(if 4F is stored at storage address 1000, for example, 52 will be at address 1001).
リトルエンディアン システムでは、次のように格納されます。524F (52 at address 1000, 4F at 1001).
1 バイト以上を使用する文字コードの場合、最上位バイトを最初に読み書きするか最後に読み書きするかを選択できるため、Unicode/UTF-16 エンコーディングではバイト エンディアン(ビッグまたはリトル) を指定する必要があります。Unicode/UTF-16 は可変長エンコーディングであるため (つまり、各文字は 1 バイトまたは数バイトで表すことができる)、これを指定する必要があります。(ただし、UTF-8 の「単語」は常に 8 ビット/1 バイトの長さであることに注意してください [ただし、文字は複数のポイントにすることができます]。したがって、エンディアンに問題はありません。) Unicode テキストを表すバイトのストリームのエンコーダーが、どの規則が使用されているかについてデコーダーが合意していない場合、間違った文字コードが解釈される可能性があります。このため、エンディアンの規則が事前にわかっているか、より一般的にはバイト オーダー マークは通常、Unicode テキスト ファイル/ストリームの先頭に指定され、ビッグ エンディアンまたはリトル エンディアンのどちらが使用されているかを示します。