Пример #1
0
        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;
                    }
                }
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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));
            }
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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
                    });
                }
            }
        }
Пример #7
0
        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");
            }
        }
Пример #8
0
 public static byte[] Decomp(BinaryReaderX br)
 {
     // above to be restored eventually with some changes to Cetera
     return(CriWare.Decompress(br.BaseStream));
 }
Пример #9
0
        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);
        }