private void ReadIndexTable() { if (stream.Length == 0) { indexOffset = sizeof(int) * 4; index.Clear(); return; } stream.Seek(0, SeekOrigin.Begin); var signature = reader.ReadInt32(); if (signature != Signature) { throw new Exception($"The asset bundle at \"{Path}\" has been corrupted"); } reader.ReadInt32(); // CheckSum var version = reader.ReadInt32(); if (version != Lime.Version.GetBundleFormatVersion()) { throw new Exception(string.Format("The bundle format has been changed. Please update Citrus and rebuild game.\n" + "Bundle format version: {0}, but expected: {1}", version, Lime.Version.GetBundleFormatVersion())); } indexOffset = reader.ReadInt32(); stream.Seek(indexOffset, SeekOrigin.Begin); int numDescriptors = reader.ReadInt32(); index.Clear(); for (int i = 0; i < numDescriptors; i++) { var desc = new AssetDescriptor(); string name = reader.ReadString(); desc.ModificationTime = DateTime.FromBinary(reader.ReadInt64()); ushort sha1Length = reader.ReadUInt16(); if (sha1Length != 0) { desc.CookingRulesSHA1 = reader.ReadBytes(sha1Length); } desc.Offset = reader.ReadInt32(); desc.Length = reader.ReadInt32(); desc.AllocatedSize = reader.ReadInt32(); desc.Attributes = (AssetAttributes)reader.ReadInt32(); desc.SourceExtension = reader.ReadString(); index.Add(name, desc); } }