1

Marshal.Copy がバイトの順序を変更するのはなぜですか? MSB(最上位バイト)に変換するように縫い付けられています。

サンプルコード:

string s = "abc 123";
byte[] data = StringToByteArray(s);
uint[] data2 = ByteArrayToUintArray(data);
//s[0] = a = 61
//data[0] = a = 61
//but data2[0] = " cba" = 0x20636261


    public static byte[] StringToByteArray(string str)
    {
        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
        return encoding.GetBytes(str);
    }

    public static uint[] ByteArrayToUintArray(byte[] data)
    {
        int lenght = (data.Length + 3) / 4;
        uint[] data2 = new uint[lenght];

        GCHandle pinnedArray = GCHandle.Alloc(data2, GCHandleType.Pinned);
        IntPtr ptr = pinnedArray.AddrOfPinnedObject();
        //do your stuff
        Marshal.Copy(data, 0, ptr, data.Length);
        pinnedArray.Free();
        return data2;
    }
4

1 に答える 1

2

プログラムが Intel プロセッサで実行されると仮定すると、整数形式はリトルエンディアンです。これは、最下位バイトが最初に来ることを意味します。したがって0x20636261、実際には次のようにメモリに格納されます

 0x61 0x62 0x63 0x20

つまり、バイト順序が変更されていないことを意味Marshal.Copyします。整数値を一連のバイトにデコードする方法の正しい順序を誤解しただけです。

于 2013-10-09T22:05:18.683 に答える