在C#.net 4中读取/写入字节数组

时间:2011-04-29 12:18:18

标签: c# bytearray buffer memory-mapped-files

问候Overflowers,

我喜欢内存映射文件的灵活性,因为您可以读取/写入任何值类型 有没有办法对字节数组做同样的事情,而不必将它们复制到例如内存映射缓冲区?

此致

4 个答案:

答案 0 :(得分:6)

您可以使用BitConverter类在基本数据类型和字节数组之间进行转换。

您可以直接从数组中读取值:

int value = BitConverter.ToInt32(data, pos);

要写入数据,请将其转换为字节数组,并将其复制到数据中:

BitConverter.GetBytes(value).CopyTo(data, pos);

答案 1 :(得分:4)

您可以将MemoryStream绑定到给定的字节数组,将其设置为属性Position以转到数组中的特定位置,然后使用BinaryReader或{{3}从/向它读取/写入不同类型的值。

答案 2 :(得分:1)

您正在搜索可以从固定大小的字节数组初始化(不复制!)的MemoryStream类。

答案 3 :(得分:0)

(使用不安全的代码) 下面的示例演示如何使用两个长值填充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,它可以在数组类型之间进行转换。