| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 | using System;using System.Collections;using System.Collections.Generic;using System.Text;using System.Diagnostics;using System.IO;namespace YooAsset{	/// <summary>	/// 数据存储以小端字节序为标准	/// </summary>	internal class BufferWriter	{		private readonly byte[] _buffer;		private int _index = 0;		public BufferWriter(int capacity)		{			_buffer = new byte[capacity];		}		/// <summary>		/// 缓冲区容量		/// </summary>		public int Capacity		{			get { return _buffer.Length; }		}		/// <summary>		/// 清空缓冲区		/// </summary>		public void Clear()		{			_index = 0;		}		/// <summary>		/// 将有效数据写入文件流		/// </summary>		public void WriteToStream(FileStream fileStream)		{			fileStream.Write(_buffer, 0, _index);		}		public void WriteBytes(byte[] data)		{			int count = data.Length;			CheckWriterIndex(count);			Buffer.BlockCopy(data, 0, _buffer, _index, count);			_index += count;		}		public void WriteByte(byte value)		{			CheckWriterIndex(1);			_buffer[_index++] = value;		}		public void WriteBool(bool value)		{			WriteByte((byte)(value ? 1 : 0));		}		public void WriteInt16(short value)		{			WriteUInt16((ushort)value);		}		public void WriteUInt16(ushort value)		{			CheckWriterIndex(2);			_buffer[_index++] = (byte)value;			_buffer[_index++] = (byte)(value >> 8);		}		public void WriteInt32(int value)		{			WriteUInt32((uint)value);		}		public void WriteUInt32(uint value)		{			CheckWriterIndex(4);			_buffer[_index++] = (byte)value;			_buffer[_index++] = (byte)(value >> 8);			_buffer[_index++] = (byte)(value >> 16);			_buffer[_index++] = (byte)(value >> 24);		}		public void WriteInt64(long value)		{			WriteUInt64((ulong)value);		}		public void WriteUInt64(ulong value)		{			CheckWriterIndex(8);			_buffer[_index++] = (byte)value;			_buffer[_index++] = (byte)(value >> 8);			_buffer[_index++] = (byte)(value >> 16);			_buffer[_index++] = (byte)(value >> 24);			_buffer[_index++] = (byte)(value >> 32);			_buffer[_index++] = (byte)(value >> 40);			_buffer[_index++] = (byte)(value >> 48);			_buffer[_index++] = (byte)(value >> 56);		}		public void WriteUTF8(string value)		{			if (string.IsNullOrEmpty(value))			{				WriteUInt16(0);			}			else			{				byte[] bytes = Encoding.UTF8.GetBytes(value);				int count = bytes.Length;				if (count > ushort.MaxValue)					throw new FormatException($"Write string length cannot be greater than {ushort.MaxValue} !");				WriteUInt16(Convert.ToUInt16(count));				WriteBytes(bytes);			}		}		public void WriteInt32Array(int[] values)		{			if (values == null)			{				WriteUInt16(0);			}			else			{				int count = values.Length;				if (count > ushort.MaxValue)					throw new FormatException($"Write array length cannot be greater than {ushort.MaxValue} !");				WriteUInt16(Convert.ToUInt16(count));				for (int i = 0; i < count; i++)				{					WriteInt32(values[i]);				}			}		}		public void WriteInt64Array(long[] values)		{			if (values == null)			{				WriteUInt16(0);			}			else			{				int count = values.Length;				if (count > ushort.MaxValue)					throw new FormatException($"Write array length cannot be greater than {ushort.MaxValue} !");				WriteUInt16(Convert.ToUInt16(count));				for (int i = 0; i < count; i++)				{					WriteInt64(values[i]);				}			}		}		public void WriteUTF8Array(string[] values)		{			if (values == null)			{				WriteUInt16(0);			}			else			{				int count = values.Length;				if (count > ushort.MaxValue)					throw new FormatException($"Write array length cannot be greater than {ushort.MaxValue} !");				WriteUInt16(Convert.ToUInt16(count));				for (int i = 0; i < count; i++)				{					WriteUTF8(values[i]);				}			}		}		[Conditional("DEBUG")]		private void CheckWriterIndex(int length)		{			if (_index + length > Capacity)			{				throw new IndexOutOfRangeException();			}		}	}}
 |