在C里面很简单,直接使用指针强制转换一下就OK,C#也支持指针,直接想到用指针转。代码如下
public static unsafe byte[] IntArrToByteArr(int[] intArr)
{
byte[] bytArr = new byte[sizeof(int) * intArr.Length];
//使用int指针指向int数组,强制转换为byte指针,逐个元素赋值给byte数组即可。
fixed (int* pInt = intArr)
{
byte* pByte = (byte*)pInt;
for (int i = 0; i < bytArr.Length; i++)
{
bytArr[i] = pByte[i];
}
}
return bytArr;
}
以上代码需要启用unsafe编译选项支持。
还有一种思路是使用Marshal.Copy()方法将int数组复制到非托管指针,再从非托管指针复制回byte数组,在不启用unsafe代码的情况下这种做法比较常见,熟悉平台调用的肯定都很熟悉System.Runtime.InteropServices.Marshal这个类下面的方法。
public static byte[] IntArrToByteArr(int[] intArr)
{
int intSize = sizeof(int) * intArr.Length;
byte[] bytArr = new byte[intSize];
//申请一块非托管内存
IntPtr ptr = Marshal.AllocHGlobal(intSize);
//复制int数组到该内存块
Marshal.Copy(intArr, 0, ptr, intArr.Length);
//复制回byte数组
Marshal.Copy(ptr, bytArr, 0, bytArr.Length);
//释放申请的非托管内存
Marshal.FreeHGlobal(ptr);
return bytArr;
}
还有两种思路是,分别将单个int值转换成byte数组,再拼起来:
使用System.BitConvert.GetBytes(Int32)方法,将每个int值转换为byte数组,然后把数组按顺序拼起来;
或者是移位运算,计算每个int值占用的4字节空间单个字节的值,得到4个byte值,生成byte数组。