- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 SequenceReader<T>
在.Net Core Preview 8中解析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
我最后的切片始终是一个空序列。
我需要做什么才能正确解析该协议(protocol)?
最佳答案
我猜.Reader
这是一个属性;这很重要,因为 SequenceReader<T>
是一个可变结构,但每次访问 .SomeProperty
时您正在使用阅读器的独立副本。将其隐藏在属性后面很好,但您需要确保您与本地人合作,然后完成后推回,即
var reader = context.Reader;
var start = reader.Position;
if (!reader.TryReadTo(out ReadOnlySequence<byte> lengthSlice,
Utf8Bytes.Period, advancePastDelimiter: true))
return false;
if (!lengthSlice.TryGetInt(out var length))
return false;
reader.Advance(length);
element = reader.Sequence.Slice(start, reader.Position);
context.Reader = reader; // update position
return true;
请注意,它的一个很好的功能是,在失败情况( return false
)中,您还不会更改状态,因为您已经只是改变了你的本地独立克隆。
您也可以考虑 ref
-返回.Reader
的属性.
关于.net-core - .Net Core 3 预览 SequenceReader 长度分隔解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708390/
我正在尝试使用 SequenceReader 在.Net Core Preview 8中解析Guacamole Protocol网络流量。 流量可能如下所示: 5.error,14.some text
我是一名优秀的程序员,十分优秀!