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

C# 在C.NET4中读取/写入字节数组,c#,bytearray,buffer,memory-mapped-files,C#,Bytearray,Buffer,Memory Mapped Files,向飞越者致意 我喜欢内存映射文件的灵活性,因为您可以读取/写入任何值类型。 是否有一种方法可以对字节数组执行相同的操作,而无需将它们复制到内存映射缓冲区中 关于您正在搜索无需复制即可初始化的类!从固定大小的字节数组。您正在搜索无需复制即可初始化的类!从固定大小的字节数组。您可以将a绑定到给定的字节数组,将其属性位置设置为转到数组中的特定位置,然后使用或从中读取/写入不同类型的值。您可以将a绑定到给定的字节数组,将其属性位置设置为转到数组中的特定位置,然后使用或从中读取/写入不同类型的值。您可以使

向飞越者致意

我喜欢内存映射文件的灵活性,因为您可以读取/写入任何值类型。 是否有一种方法可以对字节数组执行相同的操作,而无需将它们复制到内存映射缓冲区中

关于

您正在搜索无需复制即可初始化的类!从固定大小的字节数组。

您正在搜索无需复制即可初始化的类!从固定大小的字节数组。

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

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

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

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

int value = BitConverter.ToInt32(data, pos);
要写入数据,请将其转换为字节数组,然后将其复制到数据中:

BitConverter.GetBytes(value).CopyTo(data, pos);
可以使用BitConverter类在基本数据类型和字节数组之间进行转换

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

int value = BitConverter.ToInt32(data, pos);
要写入数据,请将其转换为字节数组,然后将其复制到数据中:

BitConverter.GetBytes(value).CopyTo(data, pos);
使用不安全代码 以下示例显示了如何使用两个长值填充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;
        }
    }
}
使用位转换器从字节数组中读取值没有问题,因为可以在.ToInt64中指定偏移量

替代方法:使用Buffer.BlockCopy,它可以在数组类型之间转换。

使用不安全代码 以下示例显示了如何使用两个长值填充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;
        }
    }
}
使用位转换器从字节数组中读取值没有问题,因为可以在.ToInt64中指定偏移量


备选方案:使用Buffer.BlockCopy,它可以在数组类型之间转换。

thx man!虽然命名为流,但它允许随机访问。是否有一种使用BinaryReader/Writer读取/写入值数组的方法?@geeko:您只需单击一下API文档,就可以读取/写入字符和字节数组。如果您想使用其他值类型,只需再次使用loop.thx。我以前看过文件。看来Buffer.BlockCopy和BitConvertor是一个不错的选择!虽然命名为流,但它允许随机访问。是否有一种使用BinaryReader/Writer读取/写入值数组的方法?@geeko:您只需单击一下API文档,就可以读取/写入字符和字节数组。如果您想使用其他值类型,只需再次使用loop.thx。我以前看过文件。看来Buffer.BlockCopy和BitConvertor是一个不错的选择。