public Mpq(Stream stream) { Reader = new Ibasa.IO.BinaryReader(stream, Encoding.ASCII); long offset = 0; bool founda, foundb; { Ibasa.Media.FourCC mpqa = new Media.FourCC("MPQ\x1A"); Ibasa.Media.FourCC mpqb = new Media.FourCC("MPQ\x1B"); //find offset var fourcc = Reader.Read<Ibasa.Media.FourCC>(); founda = fourcc == mpqa; foundb = fourcc == mpqb; while (!founda && !foundb) { offset += 512; fourcc = Reader.Read<Ibasa.Media.FourCC>(); founda = fourcc == mpqa; foundb = fourcc == mpqb; } } if (foundb) { var userdatasize = Reader.ReadUInt32(); offset += Reader.ReadUInt32(); var userdataheader = Reader.ReadUInt32(); } Reader.Seek(offset, SeekOrigin.Begin); if (Reader.Read<Media.FourCC>() != new Media.FourCC("MPQ\x1A")) throw new Exception("WTF"); HeaderSize = Reader.ReadUInt32(); ArchiveSize = Reader.ReadUInt32(); FormatVersion = Reader.ReadUInt16(); BlockSize = Reader.ReadUInt16(); HashTablePos = Reader.ReadUInt32(); BlockTablePos = Reader.ReadUInt32(); HashTableSize = Reader.ReadUInt32(); BlockTableSize = Reader.ReadUInt32(); if (FormatVersion >= 2) { HiBlockTablePos64 = Reader.ReadUInt64(); HashTablePosHi = Reader.ReadUInt16(); BlockTablePosHi = Reader.ReadUInt16(); } if (FormatVersion >= 3) { ArchiveSize64 = Reader.ReadUInt64(); BetTablePos64 = Reader.ReadUInt64(); HetTablePos64 = Reader.ReadUInt64(); } if (FormatVersion >= 4) { hashtablesize64 = Reader.ReadUInt64(); blocktablesize64 = Reader.ReadUInt64(); hiblocktablesize64 = Reader.ReadUInt64(); hettablesize64 = Reader.ReadUInt64(); bettablesize64 = Reader.ReadUInt64(); dawchunksize = Reader.ReadUInt32(); md5_blocktable = Reader.ReadBytes(16); md5_hashtable = Reader.ReadBytes(16); md5_hiblocktable = Reader.ReadBytes(16); md5_bettable = Reader.ReadBytes(16); md5_hettable = Reader.ReadBytes(16); md5_mpqheader = Reader.ReadBytes(16); } if (HetTablePos64 != 0) { ParseHET(); } if (BetTablePos64 != 0) { ParseBET(); } }
public Mpq(Stream stream) { Reader = new Ibasa.IO.BinaryReader(stream, Encoding.ASCII); long offset = 0; bool founda, foundb; { Ibasa.Media.FourCC mpqa = new Media.FourCC("MPQ\x1A"); Ibasa.Media.FourCC mpqb = new Media.FourCC("MPQ\x1B"); //find offset var fourcc = Reader.Read <Ibasa.Media.FourCC>(); founda = fourcc == mpqa; foundb = fourcc == mpqb; while (!founda && !foundb) { offset += 512; fourcc = Reader.Read <Ibasa.Media.FourCC>(); founda = fourcc == mpqa; foundb = fourcc == mpqb; } } if (foundb) { var userdatasize = Reader.ReadUInt32(); offset += Reader.ReadUInt32(); var userdataheader = Reader.ReadUInt32(); } Reader.Seek(offset, SeekOrigin.Begin); if (Reader.Read <Media.FourCC>() != new Media.FourCC("MPQ\x1A")) { throw new Exception("WTF"); } HeaderSize = Reader.ReadUInt32(); ArchiveSize = Reader.ReadUInt32(); FormatVersion = Reader.ReadUInt16(); BlockSize = Reader.ReadUInt16(); HashTablePos = Reader.ReadUInt32(); BlockTablePos = Reader.ReadUInt32(); HashTableSize = Reader.ReadUInt32(); BlockTableSize = Reader.ReadUInt32(); if (FormatVersion >= 2) { HiBlockTablePos64 = Reader.ReadUInt64(); HashTablePosHi = Reader.ReadUInt16(); BlockTablePosHi = Reader.ReadUInt16(); } if (FormatVersion >= 3) { ArchiveSize64 = Reader.ReadUInt64(); BetTablePos64 = Reader.ReadUInt64(); HetTablePos64 = Reader.ReadUInt64(); } if (FormatVersion >= 4) { hashtablesize64 = Reader.ReadUInt64(); blocktablesize64 = Reader.ReadUInt64(); hiblocktablesize64 = Reader.ReadUInt64(); hettablesize64 = Reader.ReadUInt64(); bettablesize64 = Reader.ReadUInt64(); dawchunksize = Reader.ReadUInt32(); md5_blocktable = Reader.ReadBytes(16); md5_hashtable = Reader.ReadBytes(16); md5_hiblocktable = Reader.ReadBytes(16); md5_bettable = Reader.ReadBytes(16); md5_hettable = Reader.ReadBytes(16); md5_mpqheader = Reader.ReadBytes(16); } if (HetTablePos64 != 0) { ParseHET(); } if (BetTablePos64 != 0) { ParseBET(); } }