using CommonLang.IO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace CommonNetwork.Utils
{
public class ReceiveBuffer
{
private MemoryStream stream;
private long w_pos;
public ReceiveBuffer(int capacity)
{
this.stream = new MemoryStream(capacity);
this.w_pos = 0;
}
public MemoryStream Stream { get { return stream; } }
public long Remaining
{
get
{
return w_pos - stream.Position;
}
}
///
/// 向缓冲区写入数据
///
///
///
///
public void Put(byte[] data, int offset, int count)
{
long oldpos = stream.Position;
try
{
stream.Position = w_pos;
IOUtil.WriteToEnd(stream, data, offset, count);
w_pos += count;
}
finally
{
stream.Position = oldpos;
}
}
public void Begin()
{
stream.Position = 0;
}
///
/// 将读取的数据制空
///
public void Over()
{
if (stream.Position > 0 )
{
if (stream.Position == w_pos)
{
stream.Position = 0;
w_pos = 0;
}
else if (stream.Position < w_pos)
{
int lp = (int)stream.Position;
int ep = (int)w_pos;
int rm = ep - lp;
byte[] buffer = stream.GetBuffer();
// 将后半段向前移动
int cc = Math.Min(lp, rm);
System.Buffer.BlockCopy(buffer, lp, buffer, 0, cc);
if (lp == cc && rm > 0)
{
// 如果后半段还有更多
int c2 = cc << 1;
System.Buffer.BlockCopy(buffer, c2, buffer, lp, ep - c2);
}
stream.Position = 0;
w_pos -= lp;
}
}
}
}
}