public int TryRead(VBufferInfo bufferInfo, out byte[] buffer, int offset, int count, int postion = 0) { buffer = new byte[count]; if (bufferInfo == null) { return(-1); } // 检测是否在范围之内 var len = buffer.Length - offset; var size = len >= count ? count : len; var trueTotal = size; // 剩下的数量 var lastCount = bufferInfo.Count - postion; trueTotal = lastCount >= trueTotal ? trueTotal : lastCount; int currentSegmentOffset; var index = SearchIndex(bufferInfo, postion, out currentSegmentOffset); var segment = this[index]; size = segment.TryRead(offset, trueTotal, bufferInfo.Offset, ref buffer); size = ReadNext(segment, buffer, trueTotal, size); return(size); }
public VBufferInfo ApplyFor(byte[] buffer, int segmentSize) { _segmentSize = segmentSize; // 当前块索引 var index = _nextSegmentIndex; var segment = QueryNext(); int offset; var size = segment.TryWrite(buffer, out offset); FillBuffer(segment, buffer, size); return(VBufferInfo.Create(index, offset, buffer.Length)); }
public byte[] ReadBytes(VBufferInfo bufferInfo) { if (bufferInfo == null) { return(null); } var buffer = new byte[bufferInfo.Count]; var segment = this[bufferInfo.SegmentIndex]; var size = segment.TryRead(bufferInfo.Offset, buffer.Length, ref buffer); ReadNext(segment, buffer, buffer.Length, size); return(buffer); }
private int SearchIndex(VBufferInfo bufferInfo, int postion, out int currentSegmentOffset) { currentSegmentOffset = 0; var index = bufferInfo.SegmentIndex; if (postion != 0) { postion += bufferInfo.Offset; var segment = this[index]; while (postion > segment.Length && segment.NeedNext) { //剔除已经过去的 postion -= segment.Length; segment = this[segment.NextIndex]; } currentSegmentOffset = postion; } return(index); }
public int TryWrite(VBufferInfo bufferInfo, byte[] buffer, int offset, int count, int postion = 0) { // 检测是否在范围之内 var len = buffer.Length - offset; var size = len >= count ? count : len; var tr = size; // 剩下的数量 var lastCount = bufferInfo.Count - postion; tr = lastCount >= tr ? tr : lastCount; int currentSegmentOffset; var index = SearchIndex(bufferInfo, postion, out currentSegmentOffset); var segment = this[index]; var writeSize = segment.TryWrite(buffer, offset, tr, currentSegmentOffset); int lastSize = -1; if (tr != writeSize) { lastCount = tr - writeSize; while (lastCount > 0 && segment.NeedNext) { segment = this[segment.NextIndex]; lastSize = segment.TryWrite(buffer, 0, lastCount); lastCount -= lastSize; } } // 将剩余的填入 0 if (lastCount > 0 && lastSize != -1) { var zBuffer = new byte[lastCount]; segment.TryWrite(zBuffer, 0, lastCount, lastSize); } return(tr); }