问题描述
我正在尝试使用以字节长度为前缀的 PipeWriter
编写二进制消息。
在整个消息完成之前,我不知道字节长度。
这完全可以用 PipeWriter
完成吗?
基本上我正在尝试实现这三种方法:
void StartMessage(PipeWriter writer)
{
// leave 4 empty bytes for length written at later time
this.header_ = writer.GetMemory(4);
writer.Advance(4);
}
void Write(PipeWriter writer,ReadOnlySpan<byte> span)
{
var buffer = writer.GetSpan(span.Length);
span.copyTo(buffer);
writer.Advance(span.Length);
this.totalLength_ += span.Length;
}
ValueTask EndMessage(PipeWriter writer)
{
// should prepend this.totalLength_ to the message
BinaryPrimities.WriteUInt32BingEndian(this.header_.Span,this.totalLength_);
// signal end of message
return writer.FlushAsync();
}
这给了我预期的结果,但 PipeWrite.Advance
的文档指出:
必须在调用 system.io.pipelines.PipeWriter.Advance(system.int32) 后请求新的缓冲区才能继续写入更多数据;您不能写入先前获得的缓冲区。
使用 PipeReader
和 Advanceto(consumed,examined)
方法可以轻松读取此类消息,其中我们仅在整个消息长度可用时才使用输入,但我一直无法想出 {{1 }} 根据文档正确的用法。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)