| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- using System;
- using System.Collections.Generic;
- namespace TNet
- {
- public class TBuffer
- {
- public const int chunkSize = 8096;
- private LinkedList<byte[]> buffer = new LinkedList<byte[]>();
- private int writeIndex;
- private int readIndex;
- public int Count
- {
- get
- {
- if (buffer.Count == 0)
- {
- return 0;
- }
- return (buffer.Count - 1) * chunkSize + writeIndex - readIndex;
- }
- }
- public byte[] ReadFrom(int n)
- {
- if (this.Count < n || n <= 0)
- {
- throw new Exception(string.Format("buffer size < n, buffer: {0} n: {1}", this.Count, n));
- }
- byte[] bytes = new byte[n];
- int alreadyCopyCount = n;
- while (alreadyCopyCount < n)
- {
- if (chunkSize - readIndex > n - alreadyCopyCount)
- {
- Array.Copy(buffer.First.Value, readIndex, bytes, alreadyCopyCount, n - alreadyCopyCount);
- readIndex += n - alreadyCopyCount;
- alreadyCopyCount = n;
- }
- else
- {
- Array.Copy(buffer.First.Value, readIndex, bytes, alreadyCopyCount, chunkSize - readIndex);
- alreadyCopyCount += chunkSize - readIndex;
- readIndex = 0;
- this.buffer.RemoveFirst();
- }
- }
- return bytes;
- }
- public void WriteTo(byte[] bytes)
- {
- int alreadyCopyCount = 0;
- while (alreadyCopyCount < bytes.Length)
- {
- if (writeIndex == 0)
- {
- this.buffer.AddLast(new byte[chunkSize]);
- }
- if (chunkSize - writeIndex > alreadyCopyCount)
- {
- Array.Copy(bytes, alreadyCopyCount, buffer.Last.Value, writeIndex, alreadyCopyCount);
- writeIndex += alreadyCopyCount;
- alreadyCopyCount = 0;
- }
- else
- {
- Array.Copy(bytes, alreadyCopyCount, buffer.Last.Value, writeIndex, chunkSize - writeIndex);
- alreadyCopyCount -= chunkSize - writeIndex;
- writeIndex = 0;
- }
- }
- }
- }
- }
|