为什么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;
}
答案 0 :(得分:2)
假设您的程序在Intel处理器上运行,整数格式为little-endian,这意味着最低有效字节首先出现。所以0x20636261
实际上存储在内存中
0x61 0x62 0x63 0x20
这意味着Marshal.Copy
没有改变字节顺序,你只是误解了如何将整数值解码为字节序列的正确顺序。