ReadOnlySequence <byte>解析

时间:2019-05-25 17:47:51

标签: 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);

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

      var DHCP_OP = buffer.Slice(0, 1).ToArray();
      var integer = BitConverter.ToInt32(DHCP_OP, 0);

那么这里有什么选择?我错过了什么吗,还是ToArray是唯一的选择? 谢谢。

2 个答案:

答案 0 :(得分:2)

这是.NET Core 3中带有SequenceReader<T>的{​​{3}}。 它提供了尝试从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
}

答案 1 :(得分:0)

这可能是几个月前解决的,但是以防万一有人偶然发现这里寻找相同的东西;

您可能正在寻找System.Runtime.InteropServices.MemoryMarshal。如果使用LayoutType.Sequential或Explicit定义结构,则只需调用MemoryMarshal.Read<DhcpDataStruct>(mySpan)即可获取填充实例。