You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:18:00