示例#1
0
        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);
            }
        }