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); }
public static string GetGamecode(System.IO.FileStream nds) { long pos = nds.Position; nds.Position = 0x0C; string gamecode = nds.ReadAscii(4); nds.Position = pos; return(gamecode); }