C#如何将int[]等基础类型数组就地转换为byte[]数组
实现方案
你可以直接复用原始数组的内存,不需要任何拷贝操作,根据你使用的.NET版本可选两种实现:
方案1:.NET Core 2.1+ / .NET 5+ 推荐方案
使用System.Runtime.InteropServices.MemoryMarshal提供的AsBytes方法,直接将原始数组的视图转换为字节视图,无任何内存分配和拷贝:
// 示例:将int[]直接转为字节视图 int[] sourceArray = new int[] { 1, 2, 3, 4 }; Span<byte> byteView = MemoryMarshal.AsBytes(sourceArray.AsSpan()); // 直接写入流,大部分现代流实现都支持Span重载 stream.Write(byteView);
该方法完全符合.NET类型安全规范,不需要开启不安全代码权限。
方案2:全.NET版本兼容方案(含.NET Framework)
使用不安全指针操作,固定原始数组内存后直接转换为字节指针使用:
// 需在项目属性中开启「允许不安全代码」选项 unsafe { int[] sourceArray = new int[] { 1, 2, 3, 4 }; fixed (int* pArray = sourceArray) { // 直接基于原始内存构造字节视图 Span<byte> byteView = new Span<byte>(pArray, sourceArray.Length * sizeof(int)); stream.Write(byteView); // 如果流不支持Span写入,可包装为UnmanagedMemoryStream使用 using var ums = new UnmanagedMemoryStream((byte*)pArray, byteView.Length); ums.CopyTo(stream); } }
注意事项
- 你已经接受收发端同端序的前提,因此上述方案不会有数据解析错误,性能比BitConverter拷贝方案提升数倍
- 不要尝试直接将
int[]强转为byte[],该操作会破坏.NET数组对象头的类型标识,触发不可预期的程序崩溃 - 生成的字节视图仅可在原始数组的生命周期内使用,不要将视图长期缓存,避免原始数组被GC回收后出现野指针访问
内容的提问来源于stack exchange,提问作者Edward Ned Harvey
相关产品推荐
相关产品推荐

