public List <ZipStorer.ZipFileEntry> ReadCentralDirectory() { if (this.centralDirectoryImage == null) { throw new InvalidOperationException("Central directory currently does not exist"); } List <ZipStorer.ZipFileEntry> list = new List <ZipStorer.ZipFileEntry>(); ushort num2; ushort num3; ushort num4; for (int i = 0; i < this.centralDirectoryImage.Length; i += (int)(46 + num2 + num3 + num4)) { uint num = BitConverter.ToUInt32(this.centralDirectoryImage, i); if (num != 33639248u) { break; } bool flag = (BitConverter.ToUInt16(this.centralDirectoryImage, i + 8) & 2048) != 0; ushort method = BitConverter.ToUInt16(this.centralDirectoryImage, i + 10); uint dosTime = BitConverter.ToUInt32(this.centralDirectoryImage, i + 12); uint crc = BitConverter.ToUInt32(this.centralDirectoryImage, i + 16); uint compressedSize = BitConverter.ToUInt32(this.centralDirectoryImage, i + 20); uint fileSize = BitConverter.ToUInt32(this.centralDirectoryImage, i + 24); num2 = BitConverter.ToUInt16(this.centralDirectoryImage, i + 28); num3 = BitConverter.ToUInt16(this.centralDirectoryImage, i + 30); num4 = BitConverter.ToUInt16(this.centralDirectoryImage, i + 32); uint headerOffset = BitConverter.ToUInt32(this.centralDirectoryImage, i + 42); uint headerSize = (uint)(46 + num2 + num3 + num4); Encoding encoding = flag ? Encoding.UTF8 : ZipStorer.defaultEncoding; ZipStorer.ZipFileEntry item = default(ZipStorer.ZipFileEntry); item.Method = (ZipStorer.CompressionMethod)method; item.FilenameInZip = encoding.GetString(this.centralDirectoryImage, i + 46, (int)num2); item.FileOffset = this.GetFileOffset(headerOffset); item.FileSize = fileSize; item.CompressedSize = compressedSize; item.HeaderOffset = headerOffset; item.HeaderSize = headerSize; item.Crc32 = crc; item.ModifyTime = ZipStorer.DosTimeToDateTime(dosTime); if (num4 > 0) { item.Comment = encoding.GetString(this.centralDirectoryImage, i + 46 + (int)num2 + (int)num3, (int)num4); } list.Add(item); } return(list); }