Пример #1
0
        private bool Load(System.IO.FileStream stream)
        {
            CreationTime        = stream.ReadUInt64();
            FileHashArrayOffset = stream.ReadUInt32();

            // This should always be 0x20, so we can use it to detect endianness
            if (FileHashArrayOffset <= 0xFFFF)
            {
                Endian = EndianUtils.Endianness.LittleEndian;
            }
            else
            {
                Endian              = EndianUtils.Endianness.BigEndian;
                CreationTime        = CreationTime.SwapEndian();
                FileHashArrayOffset = FileHashArrayOffset.SwapEndian();
            }

            // We adjust the offsets to be from file start rather than from position, makes them easier to seek to.
            FileHashArrayOffset    += (uint)stream.Position - 4;
            FileHashArraySize       = stream.ReadUInt32().FromEndian(Endian);
            VirtualHashArrayOffset  = (uint)stream.Position;
            VirtualHashArrayOffset += stream.ReadUInt32().FromEndian(Endian);
            VirtualHashArraySize    = stream.ReadUInt32().FromEndian(Endian);
            FileArrayOffset         = (uint)stream.Position;
            FileArrayOffset        += stream.ReadUInt32().FromEndian(Endian);
            FileArraySize           = stream.ReadUInt32().FromEndian(Endian);
            VirtualPackArrayOffset  = (uint)stream.Position;
            VirtualPackArrayOffset += stream.ReadUInt32().FromEndian(Endian);
            VirtualPackArraySize    = stream.ReadUInt32().FromEndian(Endian);

            // Hashes
            stream.Position = FileHashArrayOffset;
            FileHashArray   = new List <TOFHDBhash>((int)FileHashArraySize);
            for (UInt32 i = 0; i < FileHashArraySize; i++)
            {
                FileHashArray.Add(new TOFHDBhash()
                {
                    Key   = stream.ReadUInt32().FromEndian(Endian),
                    Value = stream.ReadUInt32().FromEndian(Endian),
                });
            }

            // Files
            stream.Position = FileArrayOffset;
            FileArray       = new List <TOFHDBfile>((int)FileArraySize);
            for (UInt32 i = 0; i < FileArraySize; i++)
            {
                FileArray.Add(new TOFHDBfile()
                {
                    Filesize       = stream.ReadUInt64().FromEndian(Endian),
                    CompressedSize = stream.ReadUInt64().FromEndian(Endian),
                    Offset         = stream.ReadUInt64().FromEndian(Endian),
                    Hash           = stream.ReadUInt32().FromEndian(Endian),
                    Extension      = stream.ReadAscii(0x0A).TrimNull(),
                    Unknown        = stream.ReadUInt16().FromEndian(Endian),
                });
            }

            return(true);
        }