Exemplo n.º 1
0
        internal static List <BinderFileHeader> ReadHeader(IBND4 bnd, BinaryReaderEx br)
        {
            br.AssertASCII("BND4");

            bnd.Unk04 = br.ReadBoolean();
            bnd.Unk05 = br.ReadBoolean();
            br.AssertByte(0);
            br.AssertByte(0);

            br.AssertByte(0);
            bnd.BigEndian    = br.ReadBoolean();
            bnd.BitBigEndian = !br.ReadBoolean();
            br.AssertByte(0);

            br.BigEndian = bnd.BigEndian;

            int fileCount = br.ReadInt32();

            br.AssertInt64(0x40); // Header size
            bnd.Version = br.ReadFixStr(8);
            long fileHeaderSize = br.ReadInt64();

            br.ReadInt64(); // Headers end (includes hash table)

            bnd.Unicode  = br.ReadBoolean();
            bnd.Format   = Binder.ReadFormat(br, bnd.BitBigEndian);
            bnd.Extended = br.AssertByte(0, 1, 4, 0x80);
            br.AssertByte(0);

            br.AssertInt32(0);

            if (bnd.Extended == 4)
            {
                long hashTableOffset = br.ReadInt64();
                br.StepIn(hashTableOffset);
                BinderHashTable.Assert(br);
                br.StepOut();
            }
            else
            {
                br.AssertInt64(0);
            }

            if (fileHeaderSize != Binder.GetBND4FileHeaderSize(bnd.Format))
            {
                throw new FormatException($"File header size for format {bnd.Format} is expected to be 0x{Binder.GetBND4FileHeaderSize(bnd.Format):X}, but was 0x{fileHeaderSize:X}");
            }

            var fileHeaders = new List <BinderFileHeader>(fileCount);

            for (int i = 0; i < fileCount; i++)
            {
                fileHeaders.Add(BinderFileHeader.ReadBinder4FileHeader(br, bnd.Format, bnd.BitBigEndian, bnd.Unicode));
            }

            return(fileHeaders);
        }
Exemplo n.º 2
0
        internal static void WriteHeader(IBND4 bnd, BinaryWriterEx bw, List <BinderFileHeader> fileHeaders)
        {
            bw.BigEndian = bnd.BigEndian;

            bw.WriteASCII("BND4");

            bw.WriteBoolean(bnd.Unk04);
            bw.WriteBoolean(bnd.Unk05);
            bw.WriteByte(0);
            bw.WriteByte(0);

            bw.WriteByte(0);
            bw.WriteBoolean(bnd.BigEndian);
            bw.WriteBoolean(!bnd.BitBigEndian);
            bw.WriteByte(0);

            bw.WriteInt32(fileHeaders.Count);
            bw.WriteInt64(0x40);
            bw.WriteFixStr(bnd.Version, 8);
            bw.WriteInt64(Binder.GetBND4FileHeaderSize(bnd.Format));
            bw.ReserveInt64("HeadersEnd");

            bw.WriteBoolean(bnd.Unicode);
            Binder.WriteFormat(bw, bnd.BitBigEndian, bnd.Format);
            bw.WriteByte(bnd.Extended);
            bw.WriteByte(0);

            bw.WriteInt32(0);
            bw.ReserveInt64("HashTableOffset");

            for (int i = 0; i < fileHeaders.Count; i++)
            {
                fileHeaders[i].WriteBinder4FileHeader(bw, bnd.Format, bnd.BitBigEndian, i);
            }

            for (int i = 0; i < fileHeaders.Count; i++)
            {
                fileHeaders[i].WriteFileName(bw, bnd.Format, bnd.Unicode, i);
            }

            if (bnd.Extended == 4)
            {
                bw.Pad(0x8);
                bw.FillInt64("HashTableOffset", bw.Position);
                BinderHashTable.Write(bw, fileHeaders);
            }
            else
            {
                bw.FillInt64("HashTableOffset", 0);
            }

            bw.FillInt64("HeadersEnd", bw.Position);
        }