public void extractXpck(BinaryReaderX br) { var header = br.ReadStruct <XpckHeader>(); header.correctHeader(); long bk = br.BaseStream.Position; br.BaseStream.Position = header.filenameTableOffset; byte[] filenameTable = CriWare.Decompress(new MemoryStream(br.ReadBytes((int)br.BaseStream.Length))); br.BaseStream.Position = bk; int count = 0; using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(filenameTable))) { List <XpckEntry> xpckEntries = new List <XpckEntry>(); for (int i = 0; i < header.fileCount; i++) { xpckEntries.Add(br.ReadStruct <XpckEntry>()); bk = br.BaseStream.Position; string name = getFileName(br2); if (name.Contains("cfg.bin")) { br.BaseStream.Position = xpckEntries[i].offset + header.dataOffset; byte[] cont = br.ReadBytes(xpckEntries[i].fileSize); //extractCfgBin(new BinaryReaderX(new MemoryStream(cont)), "XPCK" + count.ToString()); count += xpckEntries[i].fileSize; br.BaseStream.Position = bk; } } } }
public XI(Stream input) { using (var br = new BinaryReaderX(input)) { var header = br.ReadStruct <Header>(); Settings = new ImageSettings { Width = header.width, Height = header.height, Orientation = header.orientation, PadToPowerOf2 = false }; Settings.SetFormat(header.imageFormat); CombineFormat = header.combineFormat; if (CombineFormat != 1) { throw new Exception($"Unknown combine format {header.combineFormat}"); } var buf1 = CriWare.Decompress(input); while (input.Position % 4 != 0) { input.ReadByte(); } var buf2 = CriWare.Decompress(input); var ms = new MemoryStream(); for (int i = 0; i < buf1.Length / 2; i++) { int index = BitConverter.ToInt16(buf1, 2 * i); ms.Write(buf2, index * header.bytesPerTile, header.bytesPerTile); } Image = Common.Load(ms.ToArray(), Settings); } }
public static Bitmap Load(Stream input) { using (var br = new BinaryReaderX(input)) { //check header header = br.ReadStruct <Header>(); header.checkConst(); //decompress table br.BaseStream.Position = header.tableDataOffset; tableComp = (Compression)(br.ReadUInt32() % 8); br.BaseStream.Position = header.tableDataOffset; byte[] table = CriWare.Decompress(new MemoryStream(br.ReadBytes(header.tableSize1))); //get decompressed picture data br.BaseStream.Position = header.tableDataOffset + header.tableSize2; picComp = (Compression)(br.ReadUInt32() % 8); br.BaseStream.Position = header.tableDataOffset + header.tableSize2; byte[] tex = CriWare.Decompress(new MemoryStream(br.ReadBytes(header.imgDataSize))); //order pic blocks by table byte[] pic = Order(new BinaryReaderX(new MemoryStream(table)), table.Length, new BinaryReaderX(new MemoryStream(tex)), header.width, header.height, header.bitDepth); //return decompressed picture data var settings = new ImageSettings { Width = header.width, Height = header.height, Orientation = Orientation.TransposeTile, Format = ImageSettings.ConvertFormat(header.imageFormat), PadToPowerOf2 = false }; return(Common.Load(pic, settings)); } }
public bool Identify(string filename) { using (var br = new BinaryReaderX(File.OpenRead(filename))) { try { //possible identifications: PCK, cfg.bin, XPCK-Archive //if cfg.bin br.BaseStream.Position = 0x18; uint t1 = br.ReadUInt32(); br.BaseStream.Position = 0x24; uint t2 = br.ReadUInt32(); if (t1 == 0x0 && t2 == 0x14) { return(true); } br.BaseStream.Position = 0; //if PCK int entryCount = br.ReadInt32(); br.BaseStream.Position = 0x8; if (entryCount * 3 * 4 + 4 == br.ReadInt32()) { return(true); } br.BaseStream.Position = 0; //if XPCK if (br.ReadString(4) == "XPCK") { return(true); } else { br.BaseStream.Position = 0; byte[] result = CriWare.Decompress(new MemoryStream(br.ReadBytes((int)br.BaseStream.Length))); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(result))) { if (br2.ReadString(4) == "XPCK") { br2.BaseStream.Position = 0; return(true); } } } } catch (Exception) { } return(false); } }
public byte[] Identify(BinaryReaderX br) { //possible identifications: PCK, cfg.bin, XPCK-Archive //if cfg.bin br.BaseStream.Position = 0x18; uint t1 = br.ReadUInt32(); br.BaseStream.Position = 0x24; uint t2 = br.ReadUInt32(); br.BaseStream.Position = 0; if (t1 == 0x0 && t2 == 0x14) { type = 1; return(null); } //if PCK int entryCount = br.ReadInt32(); br.BaseStream.Position = 0x8; if (entryCount * 3 * 4 + 4 == br.ReadInt32()) { type = 2; return(null); } br.BaseStream.Position = 0; //if XPCK if (br.ReadString(4) == "XPCK") { type = 3; return(null); } else { br.BaseStream.Position = 0; byte[] result = CriWare.Decompress(new MemoryStream(br.ReadBytes((int)br.BaseStream.Length))); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(result))) { if (br2.ReadString(4) == "XPCK") { type = 3; return(result); } } } return(null); }
public XPCK(string filename) { using (BinaryReaderX xpckBr = new BinaryReaderX(File.OpenRead(filename))) { if (xpckBr.ReadString(4) == "XPCK") { xpckBr.BaseStream.Position = 0; _stream = new MemoryStream(xpckBr.ReadBytes((int)xpckBr.BaseStream.Length)); } else { xpckBr.BaseStream.Position = 0; byte[] decomp = CriWare.Decompress(xpckBr.BaseStream); _stream = new MemoryStream(decomp); } } using (BinaryReaderX xpckBr = new BinaryReaderX(_stream)) { //Header var header = xpckBr.ReadStruct <Header>(); int fileCount = header.fileInfoSize / 0xc; //fileInfo var entries = new List <Entry>(); entries.AddRange(xpckBr.ReadMultiple <Entry>(fileCount).OrderBy(e => e.fileOffset)); //nameList var nameList = new List <string>(); byte[] uncompressedNameList = CriWare.Decompress(new MemoryStream(xpckBr.ReadBytes(header.filenameTableSize))); using (BinaryReaderX nlBr = new BinaryReaderX(new MemoryStream(uncompressedNameList))) for (int i = 0; i < fileCount; i++) { nameList.Add(nlBr.ReadCStringA()); } for (int i = 0; i < fileCount; i++) { xpckBr.BaseStream.Position = header.dataOffset + entries[i].fileOffset; Files.Add(new XPCKFileInfo() { Entry = entries[i], FileName = nameList[i], FileData = new MemoryStream(xpckBr.ReadBytes(entries[i].fileSize)), State = ArchiveFileState.Archived }); } } }
public bool Identify(string filename) { using (var br = new BinaryReaderX(File.OpenRead(filename))) { if (br.BaseStream.Length < 4) { return(false); } if (br.ReadString(4) == "XPCK") { return(true); } br.BaseStream.Position = 0; byte[] decomp; try { decomp = CriWare.Decompress(br.BaseStream); } catch { return(false); } return(new BinaryReaderX(new MemoryStream(decomp)).ReadString(4) == "XPCK"); } }
public static byte[] Decomp(BinaryReaderX br) { // above to be restored eventually with some changes to Cetera return(CriWare.Decompress(br.BaseStream)); }
public static void Decompress(object sender, EventArgs e) { var tsi = sender as ToolStripMenuItem; if (!PrepareFiles("Open a " + tsi.Tag.ToString() + " compressed file...", "Save your decompressed file...", ".decomp", out FileStream openFile, out FileStream saveFile)) { return; } try { using (openFile) using (var outFs = new BinaryWriterX(saveFile)) switch (tsi.Tag) { case Compression.CriWare: outFs.Write(CriWare.Decompress(openFile)); break; case Compression.GZip: outFs.Write(GZip.Decompress(openFile)); break; case Compression.Huff4: outFs.Write(Huffman.Decompress(openFile, 4)); break; case Compression.Huff8: outFs.Write(Huffman.Decompress(openFile, 8)); break; case Compression.LZ10: outFs.Write(LZ10.Decompress(openFile)); break; case Compression.LZ11: outFs.Write(LZ11.Decompress(openFile)); break; case Compression.LZ77: outFs.Write(LZ77.Decompress(openFile)); break; /*case Compression.LZSS: * outFs.Write(LZSS.Decompress(openFile, LZSS.GetDecompressedSize(openFile))); * break;*/ case Compression.RevLZ77: outFs.Write(RevLZ77.Decompress(openFile)); break; case Compression.RLE: outFs.Write(RLE.Decompress(openFile)); break; case Compression.ZLib: outFs.Write(ZLib.Decompress(openFile)); break; } } catch (Exception ex) { MessageBox.Show(ex.ToString(), tsi?.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } MessageBox.Show($"Successfully decompressed {Path.GetFileName(openFile.Name)}.", tsi?.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); }