.net core .Net Core 3预览SequenceReader长度分隔解析

.net core .Net Core 3预览SequenceReader长度分隔解析,.net-core,guacamole,.net Core,Guacamole,我正在尝试使用.NETCorePreview 8解析网络流量 流量可能如下所示: 5.错误,14.这里有一些文本,1.0 这是一张单人票。有3个字段: 操作码=错误 原因=此处的一些文本 状态=0(请参阅) 字段以逗号分隔(以分号结尾),但每个字段上都有长度前缀。我想这是为了让你可以解析如下内容: 5.错误,24.some,文本,带逗号,1.0 要生成原因=一些,文本,带逗号 简单的逗号分隔的解析非常简单(有或没有SequenceReader)。然而,为了利用长度,我尝试了以下方法: pub

我正在尝试使用.NETCorePreview 8解析网络流量

流量可能如下所示:

5.错误,14.这里有一些文本,1.0

这是一张单人票。有3个字段:

  • 操作码=
    错误
  • 原因=
    此处的一些文本
  • 状态=
    0
    (请参阅)
字段以逗号分隔(以分号结尾),但每个字段上都有长度前缀。我想这是为了让你可以解析如下内容:

5.错误,24.some,文本,带逗号,1.0

要生成
原因
=
一些,文本,带逗号

简单的逗号分隔的解析非常简单(有或没有
SequenceReader
)。然而,为了利用长度,我尝试了以下方法:

publicstaticbooltrygetnextelement(此ref序列化上下文,out ReadOnlySequence元素)
{
元素=默认值;
var start=context.Reader.Position;
if(!context.Reader.TryReadTo(out ReadOnlySequence lengthSlice,Utf8Bytes.Period,advanceCastDelimiter:true))
返回false;
如果(!lengthSlice.TryGetInt(输出变量长度))
返回false;
语境、读者、进度(长度);
元素=context.Reader.Sequence.Slice(开始,context.Reader.Position);
返回true;
}
根据我对的理解,这应该是可行的,但我认为也可以简化,因为提案中的一些方法使生活比.NETCorePreview 8中提供的方法简单一些

然而,这段代码的问题是,
SequenceReader
似乎不像我预期的那样前进。前进时,它的属性保持不变,因此末尾的
元素
I切片始终是空序列


要正确解析此协议,我需要做什么?

我猜
.Reader
这里有一个属性;这一点很重要,因为
SequenceReader
是一个可变结构,但每次访问
.SomeProperty
时,您都在使用读取器的独立副本。把它隐藏在一个属性后面是可以的,但是你需要确保你和一个本地人一起工作,然后在完成后推回,也就是说

var reader=context.reader;
var start=读卡器位置;
如果(!reader.TryReadTo)(输出只读序列长度切片,
Utf8Bytes.Period,AdvanceCastDelimiter:true)
返回false;
如果(!lengthSlice.TryGetInt(输出变量长度))
返回false;
读卡器提前(长度);
元素=reader.Sequence.Slice(开始,reader.Position);
context.Reader=Reader;//更新位置
返回true;
请注意,这有一个很好的特性,即在失败的情况下(
返回false
),您还没有更改状态,因为您只是在变异本地独立克隆



您也可以考虑<代码> REF>代码> ->代码> Reader属性> Reader < /C> > /P>我可以看到“代码>序列化上下文< /代码>吗?特别是,

SequenceReader
是一个可变结构,因此了解
.Reader
是属性还是字段非常重要,谢谢。仍然试图完全掌握所有的
ref
/
输入
/
输出
。得到一份副本非常有意义,可以解释一切。我天真地在OP中得到了一个阅读器的4个新副本,所以当然位置总是被重置?我知道我是个柠檬,只是不知道在哪里!:D