C#如何获取byte[]数组中int类型的引用?
获取byte[]数组中int类型的引用实现方案
方法一:使用MemoryMarshal.Cast转换为Span
通过MemoryMarshal.Cast将byte数组直接转换为Span<int>,就能直接获取对应索引位置的int引用,无需不安全上下文:
class ClassFoo { private byte[] _data; public ref byte GetByteRef(int index) { return ref _data[index]; } public ref int GetIntRef(int index) { int byteOffset = index * sizeof(int); // 校验索引合法性,避免越界或未对齐访问 if (byteOffset + sizeof(int) > _data.Length) throw new ArgumentOutOfRangeException(nameof(index)); Span<int> intSpan = MemoryMarshal.Cast<byte, int>(_data); return ref intSpan[index]; } }
方法二:使用Unsafe.AsRef直接获取引用
通过Unsafe.AsRef方法,可以直接将指定位置的byte引用转换为int引用,同样无需unsafe关键字:
using System.Runtime.CompilerServices; class ClassFoo { private byte[] _data; public ref byte GetByteRef(int index) { return ref _data[index]; } public ref int GetIntRef(int index) { int byteOffset = index * sizeof(int); if (byteOffset + sizeof(int) > _data.Length) throw new ArgumentOutOfRangeException(nameof(index)); return ref Unsafe.AsRef<int>(ref _data[byteOffset]); } }
注意事项
- 必须确保
byteOffset(即index * 4)是有效的,且加上int的字节长度后不超出数组范围,否则会引发越界异常。 - 要保证内存对齐:虽然.NET允许非对齐访问,但可能会有性能损耗,建议确保byte数组的起始位置或访问偏移是int类型的对齐边界(通常是4字节)。
内容的提问来源于stack exchange,提问作者Jan Tajovsky
相关产品推荐
相关产品推荐

