web-dev-qa-db-ja.com

ビッグエンディアンとリトルエンディアンのバイト順の違い

ビッグエンディアンとリトルエンディアンのバイト順の違いは何ですか?

これらは両方ともUnicodeとUTF16に関連しているようです。これは正確にどこで使用しますか?

58
web dunia

ビッグエンディアン(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を使用するかを決定するために、仕様では、文字列にByte Order Mark(BOM)を追加することを推奨しています。文字U + FEFFを表します。したがって、UTF-16でエンコードされたテキストファイルの最初の2バイトがFEFFである場合、エンコードはUTF-16BEです。 FFFEの場合、UTF-16LEです。

視覚的な例:さまざまなエンコーディングの「例」という単語(BOM付きのUTF-16):

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

詳細については、ウィキペディアのページ エンディアンネス および/または TF-16 をご覧ください。

112
Ferdinand Beyer

フェルディナンドの答え(およびその他)は正しいですが、不完全です。

ビッグエンディアン(BE)/リトルエンディアン(LE)は、UTF-16またはUTF-32とは関係ありません。それらはユニコードの前に存在し、数値のバイトがコンピューターのメモリーに保存される方法に影響します。プロセッサに依存します。

値が0x12345678の数値がある場合、メモリ内では12 34 56 78(BE)または78 56 34 12(LE)として表されます。

UTF-16とUTF-32は、それぞれ2バイトと4バイトで表されるため、バイトの順序は、そのプラットフォームで任意の数値が続く順序を尊重します。

28
Mihai Nita

UTF-16は、Unicodeを16ビット値にエンコードします。最新のファイルシステムのほとんどは、8ビットバイトで動作します。そのため、たとえば、UTF-16エンコードファイルをディスクに保存するには、16ビット値のどの部分を最初のバイトに入れ、どの部分を2番目のバイトに入れるかを決定する必要があります。

Wikipedia には、より完全な説明があります。

7
joev

リトルエンディアン:調整

特定の16ビットまたは32ビットのWord内で、下位アドレスのバイトの重要度が低いコンピューターアーキテクチャについて説明します(Wordは「リトルエンドファースト」に格納されます)。 PDP-11およびVAXファミリーのコンピューターとIntelマイクロプロセッサー、および多くの通信およびネットワークハードウェアはリトルエンディアンです。この用語は、バイト以外のユニットの順序を表すために使用されることがあります。ほとんどの場合、バイト内のビット。

ビッグエンディアン:調整

[一般;有名な論文「聖戦と平和のための嘆願」に関するダニー・コーエン著のスウィフトのガリバー旅行から、USC/ISI IEN 137、1980年4月1日付)

特定のマルチバイト数値表現内で、最上位バイトのアドレスが最も低いコンピューターアーキテクチャについて説明します(Wordは「ビッグエンドファースト」に格納されます)。 IBM 370ファミリ、PDP-10、Motorolaマイクロプロセッサフ​​ァミリを含むほとんどのプロセッサ、およびさまざまなRISC設計のほとんどはビッグエンディアンです。ビッグエンディアンのバイト順序は、ネットワーク順序とも呼ばれます。

---用語ファイルから: http://catb.org/~esr/jargon/html/index.html

4
Paul Reiners

ビッグエンディアンとリトルエンディアンは、一連のバイトがコンピューターのメモリーに保存される順序を表す用語です。

  1. ビッグエンディアンとは、「ビッグエンド」(シーケンスの最上位値)が最初に(最下位のストレージアドレスに)格納される順序です。
  2. リトルエンディアンは、「リトルエンド」(シーケンスの最下位値)が最初に格納される順序です。

例えば

ビッグエンディアンコンピューターでは、16進数_4F52_に必要な2バイトは、ストレージ_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).として保存されます。

2
nagarajan

バイトエンディアン (ビッグまたはリトル)をUnicode/UTF-16エンコーディングに指定する必要があります。1バイト以上を使用する文字コードの場合、読み取り/書き込みを選択できるためです- 最上位バイト 最初または最後。 Unicode/UTF-16は、可変長エンコーディング(つまり、各文字を1バイトまたは複数バイトで表現できる)であるため、これを指定する必要があります。 (ただし、UTF-8の「単語」は常に8ビット/ 1バイトの長さです(文字は複数のポイントになる可能性があります)。したがって、エンディアンネスに問題はありません。)Unicodeテキストを表すバイトストリームのエンコーダとデコーダはどの規約が使用されているかについて合意されていません。間違った文字コードが解釈される可能性があります。このため、エンディアンの規則が事前に知られているか、より一般的には、Unicodeテキストファイル/ストリームの先頭に byte order mark が指定されており、エンディアンの順序が大きいか小さいかが示されています。

1
Noldorin