首页 > 解决方案 > 到缓冲区中给定指针的不安全转换

问题描述

我试图弄清楚如何让这个方法从一个索引开始,而不是从 0 - 8 个字节覆盖。此外,如果有人知道如何通过联网使这项工作与大/小 edian 机器一起工作,那就太棒了。

private byte[] buffer = new byte[30];
private int ptr = 0;

unsafe void GetBytes(ulong value)
{
    fixed (byte* b = buffer) //start at buffer[ptr]
        *((int*)b) = *(int*)&value;

    ptr += 8;
}

我想出了如何通过以下方法创建指向ptr的指针

private byte[] buffer = new byte[30];
private int ptr = 0;

unsafe void GetBytes(ulong value)
{
    fixed (byte* b = &buffer[ptr]) //start at buffer[ptr]
        *((int*)b) = *(int*)&value;

    ptr += 8;
}

标签: c#

解决方案


您可以轻松地转换字节顺序:

using System.Buffers.Binary;

if (!BitConverter.IsLittleEndian)
{
    value = BinaryPrimitives.ReverseEndianness(value);
}

我更喜欢使用Span哪个更安全、更容易阅读:

using System.Buffers.Binary;

Span<byte> span = buffer;
BinaryPrimitives.WriteUInt64LittleEndian(span.Slice(ptr), value);

如果您想使用系统的字节序而不是显式的,您也可以这样做:

using System.Runtime.InteropServices;

Span<byte> span = buffer;
MemoryMarshal.Write(span.Slice(ptr), value);

编辑非核心:

在写入指针之前,您可以使用HostToNetworkOrder将整数转换为大端。


推荐阅读