4

どういうわけか、私はブレインファートを持っていて、適切なビッグエンディアンとリトルエンディアンの表現を理解できません。32ビット整数が格納されているバイトストリームがあります。

整数は10進数の1000で、16進数の0x03E8です。リトルエンディアンでは、これはE8 032バイトとして表される場合と同じように格納されます。

4バイトのパディングが必要な場合は、として格納されると想定しました00 00 E8 03。ただし、BitConverterを使用すると、奇妙な結果が得られます。

// true
Console.WriteLine(BitConverter.IsLittleEndian);

var bytes = new byte[4] { 0x00, 0x00, 0xE8, 0x03 };
var convertedInt = BitConverter.ToInt32(bytes,0);
// 65536000 ?!
Console.WriteLine(convertedInt);

var inputInt = 1000;
var convertedBytes = BitConverter.GetBytes(inputInt);
// 4 Bytes: e8 03 00 00
Console.WriteLine("{0} Bytes: {1:x2} {2:x2} {3:x2} {4:x2}", convertedBytes.Length,
        convertedBytes[0],  convertedBytes[1],
        convertedBytes[2],  convertedBytes[3]);

これはBitConverterが壊れているようです。ドキュメントには明確に書かれています:

GetBytesメソッドによって返される配列内のバイトの順序は、コンピューターアーキテクチャがリトルエンディアンかビッグエンディアンかによって異なります。

それで、私はリトルエンディアンがどのように機能するかを誤解していますか、BitConverterが壊れていますか、それとも何か間違ったことをしますか?

4

1 に答える 1

7

だから、私はリトルエンディアンがどのように機能するかを誤解していますか?

うん。リトルエンディアンとは、重要度の最も低い部分が最初に来ることを意味します。つまり、1000は実際には

Little endian: E8 03 00 00
Big endian:    00 00 03 E8

数値の最下位バイトはE8であるため、確実に一方の端またはもう一方の端に配置する必要があります。リトルエンディアン表現では先頭に配置されます。ビッグエンディアン表現はそれを最後に置きます。あなたの提案する表現は00 00 E8 03それを真ん中に置きます。ウィキペディアのエンディアンページによると、そのような表現存在しますが、まれにしかありません。これは、混合エンディアンまたはミドルエンディアンと呼ばれます。

確認するコード:

using System;

class Test
{
    static void Main()
    {
        var bytes = new byte[4] { 0xE8, 0x03, 0x00, 0x00 };
        var convertedInt = BitConverter.ToInt32(bytes, 0);
        Console.WriteLine(convertedInt); // 1000
    }
}
于 2012-12-06T07:53:30.270 に答える