【发布时间】:2020-01-02 14:59:57
【问题描述】:
我正在尝试在 .Net Core Preview 8 中使用 SequenceReader<T> 来解析 Guacamole Protocol 网络流量。
流量可能如下所示:
5.error,14.some text here,1.0;
这是一个单一的error instruction。有3个字段:
- 操作码 =
error - 原因 =
some text here - 状态 =
0(见Status Codes)
字段以逗号分隔(分号终止),但每个字段也有长度前缀。我想这样你就可以解析如下内容:
5.error,24.some, text, with, commas,1.0;
产生Reason = some, text, with, commas。
简单的逗号分隔解析很简单(有或没有SequenceReader)。但是,为了利用长度,我尝试了以下方法:
public static bool TryGetNextElement(this ref SerializationContext context, out ReadOnlySequence<byte> element)
{
element = default;
var start = context.Reader.Position;
if (!context.Reader.TryReadTo(out ReadOnlySequence<byte> lengthSlice, Utf8Bytes.Period, advancePastDelimiter: true))
return false;
if (!lengthSlice.TryGetInt(out var length))
return false;
context.Reader.Advance(length);
element = context.Reader.Sequence.Slice(start, context.Reader.Position);
return true;
}
根据我对initial proposal 的理解,这应该可行,但我认为也可以简化,因为提案中的某些方法比 .Net Core Preview 8 中提供的方法更容易一些。
但是,此代码的问题在于 SequenceReader 似乎不像我所期望的那样 Advance。它的Position 和Consumed 属性在前进时保持不变,所以最后的element I 切片始终是一个空序列。
我需要做什么才能正确解析此协议?
【问题讨论】:
-
我可以在这里看到
SerializationContext吗?特别是,SequenceReader<T>是一个可变结构,所以知道.Reader是一个属性还是一个字段真的很重要