我想在一台PC上模拟网络类型的流。
我通过创建一个Stream
来完成此操作,该MemoryStream
包含2个基础流,一个用于读取,另一个用于写入。
然后我创建了这个类的2个实例交换2个流。目前我正在使用MemoryStream
作为2个基础流。
我现在遇到的麻烦是,如果我将X字节写入Read
,那么它的位置将为X,如果我然后执行Stream
我得不到数据,因为我在流的结尾。
鉴于我通常会进行几次读/写(因此不能在每次写入后将位置重置为0)我可以使用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 }
来获取此行为?< /强>
实际上,我想要一种字节队列,我可以以流的形式写入和读取。
即。 (忽略实际的方法参数)
{{1}}
答案 0 :(得分:9)
它实际上比我想象的要简单得多(无论如何) 我只是在执行任何操作之前恢复/记录读/写位置:
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;
}
}