123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- namespace FairyGUI.Utils
- {
-
-
-
- public class ZipReader
- {
-
-
-
- public class ZipEntry
- {
- public string name;
- public int compress;
- public uint crc;
- public int size;
- public int sourceSize;
- public int offset;
- public bool isDirectory;
- }
- ByteBuffer _stream;
- int _entryCount;
- int _pos;
- int _index;
-
-
-
-
- public ZipReader(byte[] data)
- {
- _stream = new ByteBuffer(data);
- _stream.littleEndian = true;
- int pos = _stream.length - 22;
- _stream.position = pos + 10;
- _entryCount = _stream.ReadShort();
- _stream.position = pos + 16;
- _pos = _stream.ReadInt();
- }
-
-
-
- public int entryCount
- {
- get { return _entryCount; }
- }
-
-
-
-
- public bool GetNextEntry(ZipEntry entry)
- {
- if (_index >= _entryCount)
- return false;
- _stream.position = _pos + 28;
- int len = _stream.ReadUshort();
- int len2 = _stream.ReadUshort() + _stream.ReadUshort();
- _stream.position = _pos + 46;
- string name = _stream.ReadString(len);
- name = name.Replace("\\", "/");
- entry.name = name;
- if (name[name.Length - 1] == '/')
- {
- entry.isDirectory = true;
- entry.compress = 0;
- entry.crc = 0;
- entry.size = entry.sourceSize = 0;
- entry.offset = 0;
- }
- else
- {
- entry.isDirectory = false;
- _stream.position = _pos + 10;
- entry.compress = _stream.ReadUshort();
- _stream.position = _pos + 16;
- entry.crc = _stream.ReadUint();
- entry.size = _stream.ReadInt();
- entry.sourceSize = _stream.ReadInt();
- _stream.position = _pos + 42;
- entry.offset = _stream.ReadInt() + 30 + len;
- }
- _pos += 46 + len + len2;
- _index++;
- return true;
- }
-
-
-
-
-
- public byte[] GetEntryData(ZipEntry entry)
- {
- byte[] data = new byte[entry.size];
- if (entry.size > 0)
- {
- _stream.position = entry.offset;
- _stream.ReadBytes(data, 0, entry.size);
- }
- return data;
- }
- }
- }
|