/// <summary> /// Declare a new instance of a package file /// </summary> /// <param name="file">The package file's path</param> public Package(String file) { DBPF pFile = new DBPF(file); try { IoBuffer fileR = new IoBuffer(File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read)); filePath = file; file_ = fileR; } catch { throw new Exception("File could not be opened; is the path valid?"); } }
/// <summary> /// Read a file from the package /// </summary> /// <param name="filenumber">The number of the file to read</param> /// <param name="file">The package file's IoBuffer</param> /// <returns></returns> public string Read(int filenumber, IoBuffer file) { // Read header int i = 1; string toReturn = ""; DBPF dFile = new DBPF(filePath); DBPFEntry dEntry = new DBPFEntry(); UInt32 lastPos = 0x00000000; file.Seek(SeekOrigin.Begin, 0); file.Skip(24); UInt32 numEntries = file.ReadUInt32(); numFiles = (int) numEntries; //UInt32 indOffset = file.ReadUInt32(); //file.Skip(16); file.Skip(20); UInt32 minVersion = file.ReadUInt32(); //file.Seek(SeekOrigin.Begin, indOffset); // Goto the start of the index file.Seek(SeekOrigin.Begin, 86); // Goto the start of the index Byte[] fOffset; Byte[] fSize; while (i <= filenumber) { file.Seek(SeekOrigin.Begin, lastPos + 86); if ((int)minVersion == 1) { file.ReadBytes(11); fOffset = file.ReadBytes(2); String temp = BitConverter.ToString(fOffset).Replace("-", ""); lastPos = lastPos + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier); dEntry.FileOffset = 0x00000066 + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier); //uifile1.FileOffset = fOffset; file.Seek(SeekOrigin.Current, -2); fSize = file.ReadBytes(3); temp = BitConverter.ToString(fSize).Replace("-", ""); lastPos = lastPos + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier); //uifile1.FileSize = fSize; dEntry.FileSize = UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier); //prevFileStop = BitConverter.ToInt64(fOffset, 0) + BitConverter.ToInt64(fSize, 0); } else { file.ReadBytes(16); fOffset = file.ReadBytes(2); String temp = BitConverter.ToString(fOffset).Replace("-", ""); lastPos = lastPos + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier); dEntry.FileOffset = 0x00000066 + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier); //uifile1.FileOffset = fOffset; file.Seek(SeekOrigin.Current, -2); fSize = file.ReadBytes(3); temp = BitConverter.ToString(fSize).Replace("-", ""); lastPos = lastPos + UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier); //uifile1.FileSize = fSize; dEntry.FileSize = UInt32.Parse(temp, System.Globalization.NumberStyles.AllowHexSpecifier); //prevFileStop = BitConverter.ToInt64(fOffset, 0) + BitConverter.ToInt64(fSize, 0); } if (i != filenumber) i++; else break; } toReturn = Hex2Ascii(BitConverter.ToString(dFile.GetEntry(dEntry)).Replace("-", "")); return toReturn; }
/// <summary> /// Read a file from the package /// </summary> /// <param name="fileSize">The size of the file</param> /// <param name="fileOffset">The offset of the file</param> /// <param name="file">The package file's IoBuffer</param> /// <returns></returns> public string Read(UInt32 fileSize, UInt32 fileOffset, IoBuffer file) { string toReturn = ""; DBPF dFile = new DBPF(filePath); DBPFEntry dEntry = new DBPFEntry(); file.Seek(SeekOrigin.Begin, 0); file.Skip(24); UInt32 numEntries = file.ReadUInt32(); file.Skip(20); UInt32 minVersion = file.ReadUInt32(); file.Seek(SeekOrigin.Begin, 86); // Go to the start of the index dEntry.FileOffset = fileOffset; dEntry.FileSize = fileSize; toReturn = Hex2Ascii(BitConverter.ToString(dFile.GetEntry(dEntry)).Replace("-", "")); return toReturn; }
/// <summary> /// Reads a DBPF archive from a stream. /// </summary> /// <param name="stream">The stream to read from.</param> public void Read(Stream stream) { m_EntryByID = new Dictionary<ulong, DBPFEntry>(); m_EntriesList = new List<DBPFEntry>(); var io = IoBuffer.FromStream(stream, ByteOrder.LITTLE_ENDIAN); m_Reader = io; this.Io = io; var magic = io.ReadCString(4); if (magic != "DBPF") { throw new Exception("Not a DBPF file"); } var majorVersion = io.ReadUInt32(); var minorVersion = io.ReadUInt32(); var version = majorVersion + (((double)minorVersion) / 10.0); /** Unknown, set to 0 **/ io.Skip(12); if (version == 1.0) { this.DateCreated = io.ReadInt32(); this.DateModified = io.ReadInt32(); } if (version < 2.0) { IndexMajorVersion = io.ReadUInt32(); } NumEntries = io.ReadUInt32(); uint indexOffset = 0; if (version < 2.0) { indexOffset = io.ReadUInt32(); } var indexSize = io.ReadUInt32(); if (version < 2.0) { var trashEntryCount = io.ReadUInt32(); var trashIndexOffset = io.ReadUInt32(); var trashIndexSize = io.ReadUInt32(); var indexMinor = io.ReadUInt32(); } else if (version == 2.0) { var indexMinor = io.ReadUInt32(); indexOffset = io.ReadUInt32(); io.Skip(4); } /** Padding **/ io.Skip(32); io.Seek(SeekOrigin.Begin, indexOffset); for (int i = 0; i < NumEntries; i++) { var entry = new DBPFEntry(); entry.TypeID = (DBPFTypeID)io.ReadUInt32(); entry.GroupID = (DBPFGroupID)io.ReadUInt32(); entry.InstanceID = io.ReadUInt32(); entry.SecondInstanceID = io.ReadUInt32(); entry.FileOffset = io.ReadUInt32(); entry.FileSize = io.ReadUInt32(); m_EntriesList.Add(entry); ulong id = (((ulong)entry.InstanceID) << 32) + (ulong)entry.TypeID; if (!m_EntryByID.ContainsKey(id)) m_EntryByID.Add(id, entry); if (!m_EntriesByType.ContainsKey(entry.TypeID)) m_EntriesByType.Add(entry.TypeID, new List<DBPFEntry>()); m_EntriesByType[entry.TypeID].Add(entry); } }