问候溢出者,
我喜欢内存映射文件的灵活性,因为您可以读/写任何值类型。
有没有办法对字节数组做同样的事情而不必将它们复制到例如内存映射缓冲区中?
问候
问候溢出者,
我喜欢内存映射文件的灵活性,因为您可以读/写任何值类型。
有没有办法对字节数组做同样的事情而不必将它们复制到例如内存映射缓冲区中?
问候
您可以使用BitConverter
该类在基本数据类型和字节数组之间进行转换。
您可以直接从数组中读取值:
int value = BitConverter.ToInt32(data, pos);
要写入数据,请将其转换为字节数组,并将其复制到数据中:
BitConverter.GetBytes(value).CopyTo(data, pos);
您可以将 a 绑定MemoryStream
到给定的字节数组,将其属性设置Position
为转到数组中的特定位置,然后使用 a BinaryReader
orBinaryWriter
从/向其读取/写入不同类型的值。
您正在搜索MemoryStream
可以从固定大小的字节数组中初始化(无需复制!)的类。
(使用不安全的代码)下面的示例展示了如何用两个 long 值填充一个 16 字节的数组,这是 BitConverter 在没有额外的复制操作的情况下仍然无法做到的:
byte[] bar = new byte[16];
long lValue1 = 1;
long lValue2 = 2;
unsafe {
fixed (byte* bptr = &bar[0]) {
long* lptr = (long*)bptr;
*lptr = lValue1;
// pointer arithmetic: for a long* pointer '+1' adds 8 bytes.
*(lptr + 1) = lValue2;
}
}
或者您可以制作自己的 StoreBytes() 方法:
// here the dest offset is in bytes
public static void StoreBytes(long lValue, byte[] dest, int iDestOffset) {
unsafe {
fixed (byte* bptr = &dest[iDestOffset]) {
long* lptr = (long*)bptr;
*lptr = lValue;
}
}
}
使用 BitConverter 从字节数组读取值没有问题,因为您可以在 .ToInt64 中指定偏移量。
替代方案:使用 Buffer.BlockCopy,它可以在数组类型之间进行转换。