ReadOnlySequence<byte> 解析

Nul*_*nce 4 c#

所以我开始尝试使用 Span 来解析消息代码。虽然 api 看起来很容易理解,但我似乎找不到任何方法将切片转换为值。例如,我想将 ReadOnlySequence 转换为 int。当然,我可以调用 ToArray 并使用 BitConverter,但这实际上会创建一个新数组,这正是我试图避免的。

这是我如何获取切片的示例

        var DHCP_OP = buffer.Slice(0, 1);          
        var DHCP_HTYPE = buffer.Slice(1, 1);
        var DHCP_HLEN = buffer.Slice(2, 1);
        var DHCP_HOPS = buffer.Slice(3, 1);
        var DHCP_XID = buffer.Slice(4, 4);
        var DHCP_SECS = buffer.Slice(8, 2);
        var DHCP_FLAGS = buffer.Slice(10, 2);
        var DHCP_CI_ADDR = buffer.Slice(12, 4);
        var DHCP_YI_ADDR = buffer.Slice(16, 4);
        var DHCP_SI_ADDR = buffer.Slice(20, 4);
        var DHCP_GI_ADDR = buffer.Slice(24, 4);
        var DHCP_CH_ADDR = buffer.Slice(28, 16);
        var DHCP_SNAME = buffer.Slice(44, 64);
        var DHCP_FILE = buffer.Slice(108, 128);
Run Code Online (Sandbox Code Playgroud)

这就是我可能转换为 int 的方式

      var DHCP_OP = buffer.Slice(0, 1).ToArray();
      var integer = BitConverter.ToInt32(DHCP_OP, 0);
Run Code Online (Sandbox Code Playgroud)

那么这里有哪些选择呢?我错过了什么或者 ToArray 是唯一的选择吗?谢谢。

Ray*_*Ray 5

这是在 .NET Core 3中添加的SequenceReader<T>。它提供了尝试从实例读取值的方法ReadOnlySequence<T>(当然只有在有足够的可用数据时才会成功)。

SequenceReader<T>记录在这里:

阅读简单的用法Int32是:

// using System.Buffers;

ReadOnlySequence<byte> buffer = ...;

SequenceReader<byte> reader = new SequenceReader<byte>(buffer);
if (reader.TryReadLittleEndian(out int integer))
{
    // do something with the read value, the reader advanced by sizeof(int)
}
else
{
    // possibly abort parsing as you cannot read further yet
}
Run Code Online (Sandbox Code Playgroud)