protected override void _Read(BinaryReader reader) { long baseOffset = reader.BaseStream.Position; //Read header Signature = reader.ReadUInt32(); if (!IsValid(Signature)) { throw new InvalidFileSignatureException(); } DictionaryOffset = reader.ReadUInt32(); FileCount = reader.ReadUInt32(); ContentSize = reader.ReadUInt32(); Entries.Clear(); //Read the table of content reader.BaseStream.Seek(baseOffset + DictionaryOffset, SeekOrigin.Begin); for (int i = 0; i < FileCount; i++) { IPACEntry entry = new IPACEntry(); entry.Read(reader); entry.Index = (uint)i; Entries.Add(entry); } //Read the data to the buffer of the table of content entries foreach (IPACEntry entry in Entries) { reader.BaseStream.Seek(baseOffset + entry.Offset, SeekOrigin.Begin); entry.Buffer = reader.ReadBytes((int)entry.FileSize); } }
/// <summary> /// Packs the given files into the IPAC object. /// The input files must have the same format as the unpack method /// or the file entries have to be added manually. /// </summary> public void Pack(List <string> filepaths) { Entries.Clear(); foreach (string filepath in filepaths) { IPACEntry entry = new IPACEntry(); entry.Extension = Path.GetExtension(filepath).Substring(1, 4).ToUpper(); entry.Filename = Path.GetFileNameWithoutExtension(filepath).ToUpper(); using (FileStream stream = new FileStream(filepath, FileMode.Open)) { entry.FileSize = (uint)stream.Length; entry.Buffer = new byte[stream.Length]; stream.Read(entry.Buffer, 0, entry.Buffer.Length); } Entries.Add(entry); } }
protected override void _Write(BinaryWriter writer) { long baseOffset = writer.BaseStream.Length; FileCount = (uint)Entries.Count; //Calculate offsets uint offset = 16; foreach (IPACEntry entry in Entries) { entry.Offset = offset; offset += entry.FileSize; offset += 16 - (offset % 16); offset += 16; //16 byte padding } ContentSize = offset; DictionaryOffset = ContentSize; //Write header writer.Write(Signature); writer.Write(DictionaryOffset); writer.Write(FileCount); writer.Write(ContentSize); //Write the data of the table of content files foreach (IPACEntry entry in Entries) { writer.BaseStream.Seek(baseOffset + entry.Offset, SeekOrigin.Begin); writer.Write(entry.Buffer); } //Write table of contents writer.BaseStream.Seek(baseOffset + DictionaryOffset, SeekOrigin.Begin); for (int i = 0; i < Entries.Count; i++) { IPACEntry entry = Entries[i]; entry.Index = (uint)i; entry.Write(writer); } }