You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C#
		
	
| namespace FairyGUI.Utils
 | |
| {
 | |
|     /// <summary>
 | |
|     /// 一个简单的Zip文件处理类。不处理解压。
 | |
|     /// </summary>
 | |
|     public class ZipReader
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         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;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="stream"></param>
 | |
|         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();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         public int entryCount
 | |
|         {
 | |
|             get { return _entryCount; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         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] == '/') //directory
 | |
|             {
 | |
|                 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;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="name"></param>
 | |
|         /// <returns></returns>
 | |
|         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;
 | |
|         }
 | |
|     }
 | |
| }
 |