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;
- }
- }
- }
- }
|