internal static List <BinderFileHeader> ReadBHFHeader(IBXF4 bxf, BinaryReaderEx br) { br.AssertASCII("BHF4"); bxf.Unk04 = br.ReadBoolean(); bxf.Unk05 = br.ReadBoolean(); br.AssertByte(0); br.AssertByte(0); br.AssertByte(0); bxf.BigEndian = br.ReadBoolean(); bxf.BitBigEndian = !br.ReadBoolean(); br.AssertByte(0); br.BigEndian = bxf.BigEndian; int fileCount = br.ReadInt32(); br.AssertInt64(0x40); // Header size bxf.Version = br.ReadFixStr(8); long fileHeaderSize = br.ReadInt64(); br.AssertInt64(0); bxf.Unicode = br.ReadBoolean(); bxf.Format = Binder.ReadFormat(br, bxf.BitBigEndian); bxf.Extended = br.AssertByte(0, 4); br.AssertByte(0); if (fileHeaderSize != Binder.GetBND4FileHeaderSize(bxf.Format)) { throw new FormatException($"File header size for format {bxf.Format} is expected to be 0x{Binder.GetBND4FileHeaderSize(bxf.Format):X}, but was 0x{fileHeaderSize:X}"); } br.AssertInt32(0); if (bxf.Extended == 4) { long hashGroupsOffset = br.ReadInt64(); br.StepIn(hashGroupsOffset); BinderHashTable.Assert(br); br.StepOut(); } else { br.AssertInt64(0); } var fileHeaders = new List <BinderFileHeader>(fileCount); for (int i = 0; i < fileCount; i++) { fileHeaders.Add(BinderFileHeader.ReadBinder4FileHeader(br, bxf.Format, bxf.BitBigEndian, bxf.Unicode)); } return(fileHeaders); }
internal static void WriteBHFHeader(IBXF4 bxf, BinaryWriterEx bw, List <BinderFileHeader> fileHeaders) { bw.BigEndian = bxf.BigEndian; bw.WriteASCII("BHF4"); bw.WriteBoolean(bxf.Unk04); bw.WriteBoolean(bxf.Unk05); bw.WriteByte(0); bw.WriteByte(0); bw.WriteByte(0); bw.WriteBoolean(bxf.BigEndian); bw.WriteBoolean(!bxf.BitBigEndian); bw.WriteByte(0); bw.WriteInt32(fileHeaders.Count); bw.WriteInt64(0x40); bw.WriteFixStr(bxf.Version, 8); bw.WriteInt64(Binder.GetBND4FileHeaderSize(bxf.Format)); bw.WriteInt64(0); bw.WriteBoolean(bxf.Unicode); Binder.WriteFormat(bw, bxf.BitBigEndian, bxf.Format); bw.WriteByte(bxf.Extended); bw.WriteByte(0); bw.WriteInt32(0); bw.ReserveInt64("HashTableOffset"); for (int i = 0; i < fileHeaders.Count; i++) { fileHeaders[i].WriteBinder4FileHeader(bw, bxf.Format, bxf.BitBigEndian, i); } for (int i = 0; i < fileHeaders.Count; i++) { fileHeaders[i].WriteFileName(bw, bxf.Format, bxf.Unicode, i); } if (bxf.Extended == 4) { bw.Pad(0x8); bw.FillInt64("HashTableOffset", bw.Position); BinderHashTable.Write(bw, fileHeaders); } else { bw.FillInt64("HashTableOffset", 0); } }
internal static void WriteBDFHeader(IBXF4 bxf, BinaryWriterEx bw) { bw.BigEndian = bxf.BigEndian; bw.WriteASCII("BDF4"); bw.WriteBoolean(bxf.Unk04); bw.WriteBoolean(bxf.Unk05); bw.WriteByte(0); bw.WriteByte(0); bw.WriteByte(0); bw.WriteBoolean(bxf.BigEndian); bw.WriteBoolean(!bxf.BitBigEndian); bw.WriteByte(0); bw.WriteInt32(0); bw.WriteInt64(0x30); bw.WriteFixStr(bxf.Version, 8); bw.WriteInt64(0); bw.WriteInt64(0); }