8

1 台の PC でネットワーク タイプのストリームをエミュレートしたい。

これを行うにStreamは、2 つの基になるストリーム (1 つは読み取り用、もう 1 つは書き込み用) を受け取る を作成しました。

次に、2 つのストリームを交換するこのクラスの 2 つのインスタンスを作成します。現在MemoryStream、2 つの基になるストリームとして s を使用しています。

私が今抱えている問題は、X バイトを a に書き込むとMemoryStream、その位置が X になり、次に aReadを実行すると、ストリームの最後にいるため、データが得られないことです。

私は通常、いくつかの読み取り/書き込みを行うことを考えると (そのため、書き込みのたびに位置を 0 にリセットすることはできません) 、この動作を得るために何を使用できますか?Stream

事実上、ストリームの形式で読み書きできる一種のバイト キューが必要です。

すなわち(実際のメソッド引数を無視する)

MyStream.Write({ 1, 2, 3, 4, 5, 6 });
MyStream.Write({ 7, 8 });
MyStream.Read(3) // Returns { 1, 2, 3 }
MyStream.Read(4) // Returns { 4, 5, 6, 7 }
4

1 に答える 1

11

実際には、思ったよりもずっと簡単です (私の場合はともかく)。
操作を実行する前に、読み取り/書き込み位置を復元/記録するだけです。

public class QueueStream : MemoryStream
{
    long ReadPosition;
    long WritePosition;

    public QueueStream() : base() { }

    public override int Read(byte[] buffer, int offset, int count)
    {
        Position = ReadPosition;

        var temp = base.Read(buffer, offset, count);

        ReadPosition = Position;

        return temp;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        Position = WritePosition;

        base.Write(buffer, offset, count);

        WritePosition = Position;
    }
}
于 2012-04-27T14:50:06.603 に答える