| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | using System;using System.Collections;using System.Collections.Generic;using System.Text;using System.Diagnostics;namespace YooAsset{	internal class BufferReader	{		private readonly byte[] _buffer;		private int _index = 0;		public BufferReader(byte[] data)		{			_buffer = data;		}		/// <summary>		/// 是否有效		/// </summary>		public bool IsValid		{			get			{				if (_buffer == null || _buffer.Length == 0)					return false;				else					return true;			}		}		/// <summary>		/// 缓冲区容量		/// </summary>		public int Capacity		{			get { return _buffer.Length; }		}		public byte[] ReadBytes(int count)		{			CheckReaderIndex(count);			var data = new byte[count];			Buffer.BlockCopy(_buffer, _index, data, 0, count);			_index += count;			return data;		}		public byte ReadByte()		{			CheckReaderIndex(1);			return _buffer[_index++];		}		public bool ReadBool()		{			CheckReaderIndex(1);			return _buffer[_index++] == 1;		}		public short ReadInt16()		{			CheckReaderIndex(2);			if (BitConverter.IsLittleEndian)			{				short value = (short)((_buffer[_index]) | (_buffer[_index + 1] << 8));				_index += 2;				return value;			}			else			{				short value = (short)((_buffer[_index] << 8) | (_buffer[_index + 1]));				_index += 2;				return value;			}		}		public ushort ReadUInt16()		{			return (ushort)ReadInt16();		}		public int ReadInt32()		{			CheckReaderIndex(4);			if (BitConverter.IsLittleEndian)			{				int value = (_buffer[_index]) | (_buffer[_index + 1] << 8) | (_buffer[_index + 2] << 16) | (_buffer[_index + 3] << 24);				_index += 4;				return value;			}			else			{				int value = (_buffer[_index] << 24) | (_buffer[_index + 1] << 16) | (_buffer[_index + 2] << 8) | (_buffer[_index + 3]);				_index += 4;				return value;			}		}		public uint ReadUInt32()		{			return (uint)ReadInt32();		}		public long ReadInt64()		{			CheckReaderIndex(8);			if (BitConverter.IsLittleEndian)			{				int i1 = (_buffer[_index]) | (_buffer[_index + 1] << 8) | (_buffer[_index + 2] << 16) | (_buffer[_index + 3] << 24);				int i2 = (_buffer[_index + 4]) | (_buffer[_index + 5] << 8) | (_buffer[_index + 6] << 16) | (_buffer[_index + 7] << 24);				_index += 8;				return (uint)i1 | ((long)i2 << 32);			}			else			{				int i1 = (_buffer[_index] << 24) | (_buffer[_index + 1] << 16) | (_buffer[_index + 2] << 8) | (_buffer[_index + 3]);				int i2 = (_buffer[_index + 4] << 24) | (_buffer[_index + 5] << 16) | (_buffer[_index + 6] << 8) | (_buffer[_index + 7]);				_index += 8;				return (uint)i2 | ((long)i1 << 32);			}		}		public ulong ReadUInt64()		{			return (ulong)ReadInt64();		}		public string ReadUTF8()		{			ushort count = ReadUInt16();			if (count == 0)				return string.Empty;			CheckReaderIndex(count);			string value = Encoding.UTF8.GetString(_buffer, _index, count);			_index += count;			return value;		}		public int[] ReadInt32Array()		{			ushort count = ReadUInt16();			int[] values = new int[count];			for (int i = 0; i < count; i++)			{				values[i] = ReadInt32();			}			return values;		}		public long[] ReadInt64Array()		{			ushort count = ReadUInt16();			long[] values = new long[count];			for (int i = 0; i < count; i++)			{				values[i] = ReadInt64();			}			return values;		}		public string[] ReadUTF8Array()		{			ushort count = ReadUInt16();			string[] values = new string[count];			for (int i = 0; i < count; i++)			{				values[i] = ReadUTF8();			}			return values;		}		[Conditional("DEBUG")]		private void CheckReaderIndex(int length)		{			if (_index + length > Capacity)			{				throw new IndexOutOfRangeException();			}		}	}}
 |