我想将二维int数组转换为字节数组。这样做最简单的方法是什么?
示例:
int[,] array = new int[2, 2] { { 2, 1 }, { 0, 1 } };
如何将array
转换为byte[]
?在你的答案,请包括相反的功能。 (如果有将int[,]
转换为byte[]
的功能,请告诉我如何将byte[]
转换为int[,]
)
如果您问自己为什么需要这样做:我需要通过TCP客户端向服务器发送int[,]
,然后向客户端发送响应
PS:我考虑创建一个[Serializeable]
类,它将包含int[,]
,然后将类序列化为一个文件并发送该文件,在服务器端我将反序列化该文件并从中获取数组那里。但我认为要做到这一点需要更多的重点,然后将其转换为byte[]
。
谢谢您的帮助! :)
答案 0 :(得分:2)
简短回答:Buffer.BlockCopy
。
public static byte[] ToBytes<T>(this T[,] array) where T : struct
{
var buffer = new byte[array.GetLength(0) * array.GetLength(1) * System.Runtime.InteropServices.Marshal.SizeOf(typeof(T))];
Buffer.BlockCopy(array, 0, buffer, 0, buffer.Length);
return buffer;
}
public static void FromBytes<T>(this T[,] array, byte[] buffer) where T : struct
{
var len = Math.Min(array.GetLength(0) * array.GetLength(1) * System.Runtime.InteropServices.Marshal.SizeOf(typeof(T)), buffer.Length);
Buffer.BlockCopy(buffer, 0, array, 0, len);
}
答案 1 :(得分:0)
如果您不担心使用不安全的代码,那很简单:
int[,] array = new int[2, 2];
//Do whatever to fill the array
byte[] buffer = new byte[array.GetLength(0) * array.GetLength(1) * sizeof(int)];
fixed (void* pArray = &array[0,0])
{
byte* pData = (byte*)pArray;
for (int buc = 0; buc < buffer.Length; buc++)
buffer[buc] = *(pData + buc);
}