不安全地转换为缓冲区中的给定指针

时间:2019-06-29 00:50:08

标签: c#

我试图弄清楚如何使该方法从ptr索引开始,而不是从0-8个字节覆盖。另外,如果有人通过网络知道如何使用Big / Little 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;
}

1 个答案:

答案 0 :(得分:2)

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

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将整数转换为big endian。