【问题标题】:Reading from/Writing to Byte Arrays in C# .net 4在 C# .net 4 中读取/写入字节数组
【发布时间】:2011-04-29 12:18:18
【问题描述】:

问候溢出者,

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

问候

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢你!尽管命名为流,但它允许随机访问。有没有办法使用 BinaryReader/Writer 读取/写入值数组?赞赏。
      • @geeko:您只需点击一下 API 文档,就有读取/写入字符和字节数组的方法。如果您想要其他值类型,只需使用循环即可。
      • 再次感谢。我以前读过文档。看来 Buffer.BlockCopy 和 BitConvertor 是要走的路。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-11-04
          • 1970-01-01
          • 2011-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多