【问题标题】:Advice neaed: a best way to write binary data to pipe建议需要:将二进制数据写入管道的最佳方法
【发布时间】:2022-02-01 19:28:19
【问题描述】:

我需要一种以最小分配写入数据的方法,尽可能从 ReadOnlySequence 读取数据。

我发现的最好方法是来自侧库的SpanWriter

但可能有人知道更好的标准解决方案。

using System.IO.Pipelines

namespace WriteSample
{
    public async Task Write()
    {
        var pipe = new Pipe();

        var memory = pipe.Writer.GetMemory(2048);
        
        var writer = new Writer???(memory.Span);

        writer.Write((byte)0xFF);
        writer.Write((long)12345);
        writer.WriteBigEndian((long)12345);

        await pipe.Writer.FlushAsync()

    }
}

【问题讨论】:

  • 请注意,您不是在呼叫pipe.Writer.Advance(x)

标签: c# html memory pipe


【解决方案1】:

运行时提供的方式是using BinaryPrimitives:

var span = memory.Span;
span[0] = 0xFF;
BinaryPrimitives.WriteInt64LittleEndian(span.Slice(1), 12345);
BinaryPrimitives.WriteInt64BigEndian(span.Slice(9), 12345);

这确实有一个缺点,即您需要跟踪到目前为止您已写入的跨度中的位置,这与例如BinaryWriter。我不知道运行时中有任何类型可以帮助解决这个问题,所以如果你关心的话,你可能必须自己编写。

类似:

public ref struct SpanWriter
{
    private Span<byte> span;    
    public SpanWriter(Span<byte> span) => this.span = span;
    
    public void WriteInt64BigEndian(long value)
    {
        BinaryPrimitives.WriteInt64BigEndian(span, value);
        span = span.Slice(8);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多