为什么将字节数组复制到 uint 数组会更改数据的顺序

本文关键字:数组 数据 顺序 字节 字节数 复制 为什么 uint | 更新日期: 2023-09-27 18:34:35

为什么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;
    }

为什么将字节数组复制到 uint 数组会更改数据的顺序

假设您的程序在英特尔处理器上运行,整数格式为小端序,这意味着最低有效字节排在第一位。所以0x20636261实际上存储在内存中

 0x61 0x62 0x63 0x20

这意味着Marshal.Copy没有更改字节顺序,您只是误解了如何将整数值解码为字节序列的正确顺序。