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

发布于 2024-11-04 18:23:47 字数 106 浏览 0 评论 0原文

问候溢出者,

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

问候

Greetings Overflowers,

I love the flexibility of memory mapped files in that you can read/write any value type.
Is there a way to do the same with byte arrays without having to copy them into for e.g. a memory map buffers ?

Regards

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

温柔嚣张 2024-11-11 18:23:47

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

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

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

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

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

You can use the BitConverter class to convert between base data types and byte arrays.

You can read values directly from the array:

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

To write data you convert it to a byte array, and copy it into the data:

BitConverter.GetBytes(value).CopyTo(data, pos);
没有你我更好 2024-11-11 18:23:47

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

You can bind a MemoryStream to a given byte array, set it's property Position to go to a specific position within the array, and then use a BinaryReader or BinaryWriter to read / write values of different types from/to it.

一影成城 2024-11-11 18:23:47

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

You are searching the MemoryStream class which can be initialised (without copying!) from a fixed-size byte array.

任谁 2024-11-11 18:23:47

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

(Using unsafe code)
The following sample shows how to fill a 16 byte array with two long values, which is something BitConverter still can't do without an additional copy operation:

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;
    }
}

Or you could make your own StoreBytes() method:

// 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;
        }
    }
}

Reading values from a byte array is no problem with BitConverter since you can specify the offset in .ToInt64.

Alternative : use Buffer.BlockCopy, which can convert between array types.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文