public static Bnd4FileEntry Read(Stream inputStream, int fileSize, string fileName) { Bnd4FileEntry result = new Bnd4FileEntry(); BinaryReader reader = new BinaryReader(inputStream, Encoding.UTF8, true); result.FileName = fileName; result.EntryData = reader.ReadBytes(fileSize); return(result); }
private void Read(Stream inputStream) { BinaryReader reader = new BinaryReader(inputStream, Encoding.ASCII, true); string signature = reader.ReadString(4); if (signature != Bnd4Signature) { throw new Exception("Unknown signature"); } reader.Skip(8); int fileCount = reader.ReadInt32(); reader.Skip(8); string version = reader.ReadString(8); int directoryEntrySize = reader.ReadInt32(); reader.Skip(4); int dataOffset = reader.ReadInt32(); reader.Skip(4); byte encoding = reader.ReadByte(); reader.Skip(15); switch (encoding) { case 0: break; case 1: reader = new BinaryReader(inputStream, Encoding.Unicode, true); break; default: Debug.WriteLine("Unknown encoding " + encoding); break; } // Directory section for (int i = 0; i < fileCount; i++) { int fileEntryOffset; int fileNameOffset; reader.Skip(8); int fileEntrySize = reader.ReadInt32(); reader.Skip(4); if (directoryEntrySize == 36) { reader.Skip(8); fileEntryOffset = reader.ReadInt32(); reader.Skip(4); fileNameOffset = reader.ReadInt32(); } else { fileEntryOffset = reader.ReadInt32(); fileNameOffset = reader.ReadInt32(); } long position = reader.GetPosition(); string fileName = ""; if (fileNameOffset > 0) { reader.Seek(fileNameOffset); fileName = reader.ReadNullTerminatedString(); } reader.Seek(fileEntryOffset); _entries.Add(Bnd4FileEntry.Read(inputStream, fileEntrySize, fileName)); reader.Seek(position); } }