| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 | using System;using System.Text;using System.Collections.Generic;using UnityEngine;namespace FairyGUI.Utils{    /// <summary>    ///     /// </summary>    public class ByteBuffer    {        /// <summary>        ///         /// </summary>        public bool littleEndian;        /// <summary>        ///         /// </summary>        public string[] stringTable;        /// <summary>        ///         /// </summary>        public int version;        int _pointer;        int _offset;        int _length;        byte[] _data;        static byte[] temp = new byte[8];        /// <summary>        ///         /// </summary>        /// <param name="data"></param>        /// <param name="offset"></param>        /// <param name="length"></param>        public ByteBuffer(byte[] data, int offset = 0, int length = -1)        {            _data = data;            _pointer = 0;            _offset = offset;            if (length < 0)                _length = data.Length - offset;            else                _length = length;            littleEndian = false;        }        /// <summary>        ///         /// </summary>        public int position        {            get { return _pointer; }            set { _pointer = value; }        }        /// <summary>        ///         /// </summary>        public int length        {            get { return _length; }        }        /// <summary>        ///         /// </summary>        public bool bytesAvailable        {            get { return _pointer < _length; }        }        /// <summary>        ///         /// </summary>        public byte[] buffer        {            get { return _data; }            set            {                _data = value;                _pointer = 0;                _offset = 0;                _length = _data.Length;            }        }        /// <summary>        ///         /// </summary>        /// <param name="count"></param>        /// <returns></returns>        public int Skip(int count)        {            _pointer += count;            return _pointer;        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public byte ReadByte()        {            return _data[_offset + _pointer++];        }        /// <summary>        ///         /// </summary>        /// <param name="output"></param>        /// <param name="destIndex"></param>        /// <param name="count"></param>        /// <returns></returns>        public byte[] ReadBytes(byte[] output, int destIndex, int count)        {            if (count > _length - _pointer)                throw new ArgumentOutOfRangeException();            Array.Copy(_data, _offset + _pointer, output, destIndex, count);            _pointer += count;            return output;        }        /// <summary>        ///         /// </summary>        /// <param name="count"></param>        /// <returns></returns>        public byte[] ReadBytes(int count)        {            if (count > _length - _pointer)                throw new ArgumentOutOfRangeException();            byte[] result = new byte[count];            Array.Copy(_data, _offset + _pointer, result, 0, count);            _pointer += count;            return result;        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public ByteBuffer ReadBuffer()        {            int count = ReadInt();            ByteBuffer ba = new ByteBuffer(_data, _pointer, count);            ba.stringTable = stringTable;            ba.version = version;            _pointer += count;            return ba;        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public char ReadChar()        {            return (char)ReadShort();        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public bool ReadBool()        {            bool result = _data[_offset + _pointer] == 1;            _pointer++;            return result;        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public short ReadShort()        {            int startIndex = _offset + _pointer;            _pointer += 2;            if (littleEndian)                return (short)(_data[startIndex] | (_data[startIndex + 1] << 8));            else                return (short)((_data[startIndex] << 8) | _data[startIndex + 1]);        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public ushort ReadUshort()        {            return (ushort)ReadShort();        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public int ReadInt()        {            int startIndex = _offset + _pointer;            _pointer += 4;            if (littleEndian)                return (_data[startIndex]) | (_data[startIndex + 1] << 8) | (_data[startIndex + 2] << 16) | (_data[startIndex + 3] << 24);            else                return (_data[startIndex] << 24) | (_data[startIndex + 1] << 16) | (_data[startIndex + 2] << 8) | (_data[startIndex + 3]);        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public uint ReadUint()        {            return (uint)ReadInt();        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public float ReadFloat()        {            int startIndex = _offset + _pointer;            _pointer += 4;            if (littleEndian == BitConverter.IsLittleEndian)                return BitConverter.ToSingle(_data, startIndex);            else            {                temp[3] = _data[startIndex];                temp[2] = _data[startIndex + 1];                temp[1] = _data[startIndex + 2];                temp[0] = _data[startIndex + 3];                return BitConverter.ToSingle(temp, 0);            }        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public long ReadLong()        {            int startIndex = _offset + _pointer;            _pointer += 8;            if (littleEndian)            {                int i1 = (_data[startIndex]) | (_data[startIndex + 1] << 8) | (_data[startIndex + 2] << 16) | (_data[startIndex + 3] << 24);                int i2 = (_data[startIndex + 4]) | (_data[startIndex + 5] << 8) | (_data[startIndex + 6] << 16) | (_data[startIndex + 7] << 24);                return (uint)i1 | ((long)i2 << 32);            }            else            {                int i1 = (_data[startIndex] << 24) | (_data[startIndex + 1] << 16) | (_data[startIndex + 2] << 8) | (_data[startIndex + 3]);                int i2 = (_data[startIndex + 4] << 24) | (_data[startIndex + 5] << 16) | (_data[startIndex + 6] << 8) | (_data[startIndex + 7]);                return (uint)i2 | ((long)i1 << 32);            }        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public double ReadDouble()        {            int startIndex = _offset + _pointer;            _pointer += 8;            if (littleEndian == BitConverter.IsLittleEndian)                return BitConverter.ToDouble(_data, startIndex);            else            {                temp[7] = _data[startIndex];                temp[6] = _data[startIndex + 1];                temp[5] = _data[startIndex + 2];                temp[4] = _data[startIndex + 3];                temp[3] = _data[startIndex + 4];                temp[2] = _data[startIndex + 5];                temp[1] = _data[startIndex + 6];                temp[0] = _data[startIndex + 7];                return BitConverter.ToSingle(temp, 0);            }        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public string ReadString()        {            ushort len = ReadUshort();            string result = Encoding.UTF8.GetString(_data, _offset + _pointer, len);            _pointer += len;            return result;        }        /// <summary>        ///         /// </summary>        /// <param name="len"></param>        /// <returns></returns>        public string ReadString(int len)        {            string result = Encoding.UTF8.GetString(_data, _offset + _pointer, len);            _pointer += len;            return result;        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public string ReadS()        {            int index = ReadUshort();            if (index == 65534) //null                return null;            else if (index == 65533)                return string.Empty;            else                return stringTable[index];        }        /// <summary>        ///         /// </summary>        /// <param name="cnt"></param>        /// <returns></returns>        public string[] ReadSArray(int cnt)        {            string[] ret = new string[cnt];            for (int i = 0; i < cnt; i++)                ret[i] = ReadS();            return ret;        }        private static List<GPathPoint> helperPoints = new List<GPathPoint>();        /// <summary>        ///         /// </summary>        /// <param name="result"></param>        public List<GPathPoint> ReadPath()        {            helperPoints.Clear();                        int len = ReadInt();            if (len == 0)                return helperPoints;            for (int i = 0; i < len; i++)            {                GPathPoint.CurveType curveType = (GPathPoint.CurveType)ReadByte();                switch (curveType)                {                    case GPathPoint.CurveType.Bezier:                        helperPoints.Add(new GPathPoint(new Vector3(ReadFloat(), ReadFloat(), 0),                            new Vector3(ReadFloat(), ReadFloat(), 0)));                        break;                    case GPathPoint.CurveType.CubicBezier:                        helperPoints.Add(new GPathPoint(new Vector3(ReadFloat(), ReadFloat(), 0),                            new Vector3(ReadFloat(), ReadFloat(), 0),                            new Vector3(ReadFloat(), ReadFloat(), 0)));                        break;                    default:                        helperPoints.Add(new GPathPoint(new Vector3(ReadFloat(), ReadFloat(), 0), curveType));                        break;                }            }            return helperPoints;        }        /// <summary>        ///         /// </summary>        /// <param name="value"></param>        public void WriteS(string value)        {            int index = ReadUshort();            if (index != 65534 && index != 65533)                stringTable[index] = value;        }        /// <summary>        ///         /// </summary>        /// <returns></returns>        public Color ReadColor()        {            int startIndex = _offset + _pointer;            byte r = _data[startIndex];            byte g = _data[startIndex + 1];            byte b = _data[startIndex + 2];            byte a = _data[startIndex + 3];            _pointer += 4;            return new Color32(r, g, b, a);        }        /// <summary>        ///         /// </summary>        /// <param name="indexTablePos"></param>        /// <param name="blockIndex"></param>        /// <returns></returns>        public bool Seek(int indexTablePos, int blockIndex)        {            int tmp = _pointer;            _pointer = indexTablePos;            int segCount = _data[_offset + _pointer++];            if (blockIndex < segCount)            {                bool useShort = _data[_offset + _pointer++] == 1;                int newPos;                if (useShort)                {                    _pointer += 2 * blockIndex;                    newPos = ReadShort();                }                else                {                    _pointer += 4 * blockIndex;                    newPos = ReadInt();                }                if (newPos > 0)                {                    _pointer = indexTablePos + newPos;                    return true;                }                else                {                    _pointer = tmp;                    return false;                }            }            else            {                _pointer = tmp;                return false;            }        }    }}
 |