コード例 #1
0
        static void Test(byte[] bytes, Method method)
        {
            var bytes2 = new byte[bytes.Length];

            switch (method)
            {
            case Method.Ninty:
                bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.LZ10)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.LZ11)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.Huff4)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.Huff8)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.RLE)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                break;

            case Method.L5:
                bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.NoCompression)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.LZ10)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.Huffman4Bit)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.Huffman8Bit)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.RLE)));
                Assert.IsTrue(bytes.SequenceEqual(bytes2));
                break;
            }
        }
コード例 #2
0
        public XPCK(Stream input)
        {
            _stream = input;
            using (var br = new BinaryReaderX(input, true))
            {
                //Header
                header = br.ReadStruct <Header>();

                //Entries
                br.BaseStream.Position = header.fileInfoOffset;
                entries.AddRange(br.ReadMultiple <FileInfoEntry>(header.fileCount));

                //Filenames
                br.BaseStream.Position = header.filenameTableOffset;
                compNameTable          = br.ReadBytes(header.filenameTableSize);
                var decNames = new MemoryStream(Level5.Decompress(new MemoryStream(compNameTable)));

                //Files
                using (var nameList = new BinaryReaderX(decNames))
                    for (int i = 0; i < entries.Count; i++)
                    {
                        nameList.BaseStream.Position = entries[i].nameOffset;
                        Files.Add(new XPCKFileInfo
                        {
                            State    = ArchiveFileState.Archived,
                            FileName = nameList.ReadCStringA(),
                            FileData = new SubStream(br.BaseStream, header.dataOffset + entries[i].fileOffset, entries[i].fileSize),
                            Entry    = entries[i]
                        });
                    }
            }
        }
コード例 #3
0
ファイル: XI.cs プロジェクト: benladen/Kuriimu
        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 = Level5.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 = Level5.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
ファイル: TTBIN.cs プロジェクト: DarkSynopsis/Kuriimu
        public void extractXpck(BinaryReaderX br)
        {
            var header = br.ReadStruct <XpckHeader>();

            header.correctHeader();

            long bk = br.BaseStream.Position;

            br.BaseStream.Position = header.filenameTableOffset;
            byte[] filenameTable = Level5.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;
                    }
                }
            }
        }
コード例 #5
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, Format = ImageSettings.ConvertFormat(header.imageFormat), Orientation = header.orientation, PadToPowerOf2 = false
                };
                CombineFormat = header.combineFormat;

                if (CombineFormat != 1)
                {
                    throw new Exception($"Unknown combine format {header.combineFormat}");
                }

                var buf1 = Level5.Decompress(input);
                while (input.Position % 4 != 0)
                {
                    input.ReadByte();
                }
                var buf2 = Level5.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);
            }
        }
コード例 #6
0
        public static Bitmap Load(Stream input)
        {
            using (var br = new BinaryReaderX(input))
            {
                //Header
                header = br.ReadStruct <Header>();
                header.checkFormat();

                //get tile table
                br.BaseStream.Position = header.tableDataOffset;
                byte[] table = Level5.Decompress(new MemoryStream(br.ReadBytes(header.tableSize1)));

                //get image data
                br.BaseStream.Position = header.tableDataOffset + header.tableSize2;
                byte[] tex = Level5.Decompress(new MemoryStream(br.ReadBytes(header.imgDataSize)));

                //order pic blocks by table
                byte[] pic = Order(new MemoryStream(table), new MemoryStream(tex));

                //return finished image
                var settings = new ImageSettings
                {
                    Width         = header.width,
                    Height        = header.height,
                    Format        = ImageSettings.ConvertFormat(header.imageFormat),
                    PadToPowerOf2 = false,
                    ZOrder        = false
                };
                return(Common.Load(pic, settings));
            }
        }
コード例 #7
0
        private void ReadStream(Stream stream)
        {
            using (var reader = new ImprovedBinaryReader(stream))
            {
                // header
                header = reader.ReadStruct <Header>();

                // table 0
                reader.BaseStream.Position = header.T0 << 2;
                using (var table0 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream))))
                {
                    while (table0.BaseStream.Position < table0.BaseStream.Length)
                    {
                        t0_list.Add(table0.ReadStruct <T0Entry>());
                    }
                }

                // table 1
                reader.BaseStream.Position = header.T1 << 2;
                using (var table1 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream))))
                {
                    while (table1.BaseStream.Position < table1.BaseStream.Length)
                    {
                        t1_list.Add(table1.ReadStruct <T1Entry>());
                    }
                }

                // table 2
                reader.BaseStream.Position = header.T2 << 2;
                using (var table2 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream))))
                {
                    while (table2.BaseStream.Position < table2.BaseStream.Length)
                    {
                        t2_list.Add(table2.ReadStruct <T2Entry>());
                    }
                }

                // table 3
                reader.BaseStream.Position = header.T3 << 2;
                using (var table3 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream))))
                {
                    while (table3.BaseStream.Position < table3.BaseStream.Length)
                    {
                        t3_list.Add(table3.ReadStruct <T3Entry>());
                    }
                }

                // table 4
                reader.BaseStream.Position = header.T4 << 2;
                using (var table4 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream))))
                {
                    while (table4.BaseStream.Position < table4.BaseStream.Length)
                    {
                        t4_data.Add(table4.ReadByte());
                    }
                }
            }
        }
コード例 #8
0
        public XFSA(Stream input)
        {
            _stream = input;
            using (var br = new BinaryReaderX(input, true))
            {
                //Header
                header = br.ReadStruct <Header>();

                //Table 0
                br.BaseStream.Position = header.table0Offset;
                table0Comp             = GetCompressionMethod(br.BaseStream);
                table0 = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <Table0Entry>(header.table0EntryCount);

                //Table 1
                br.BaseStream.Position = header.table1Offset;
                table1Comp             = GetCompressionMethod(br.BaseStream);
                table1 = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <Table1Entry>(header.table1EntryCount);

                //File Entry Table
                br.BaseStream.Position = header.fileEntryTableOffset;
                entriesComp            = GetCompressionMethod(br.BaseStream);
                entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <FileEntry>(header.fileEntryCount);

                //String Table
                br.BaseStream.Position = header.nameTableOffset;
                stringComp             = GetCompressionMethod(br.BaseStream);
                stringTable            = Level5.Decompress(br.BaseStream);

                //Add Files
                using (var stringReader = new BinaryReaderX(new MemoryStream(stringTable)))
                {
                    foreach (var dir in table0)
                    {
                        stringReader.BaseStream.Position = dir.dirNameOffset;
                        var dirName        = stringReader.ReadCStringSJIS();
                        var fileCountInDir = 0;
                        foreach (var file in entries.Where((e, i) => i >= dir.fileEntryOffset && i < dir.fileEntryOffset + dir.fileCountInDir))
                        {
                            stringReader.BaseStream.Position = dir.firstFileNameInDir + file.nameOffset;
                            var fileName = stringReader.ReadCStringSJIS();
                            Files.Add(new XFSAFileInfo
                            {
                                State          = ArchiveFileState.Archived,
                                FileName       = Path.Combine(dirName, fileName),
                                FileData       = new SubStream(br.BaseStream, header.dataOffset + (file.offset << 4), file.size),
                                fileEntry      = file,
                                fileCountInDir = fileCountInDir++,
                                dirEntry       = dir
                            });
                        }
                    }
                }
            }
        }
コード例 #9
0
ファイル: XFSA.cs プロジェクト: juliosueiras/Kuriimu
        public XFSA(Stream input)
        {
            _stream = input;
            using (var br = new BinaryReaderX(input, true))
            {
                //Header
                header = br.ReadStruct <Header>();

                //1st table
                br.BaseStream.Position = header.offset1;
                table1Comp             = (byte)(br.ReadByte() & 7);
                br.BaseStream.Position--;
                var tmpT1 = br.ReadBytes((int)(header.offset2 - header.offset1));
                table1 = new BinaryReaderX(Support.DecompressToStream(tmpT1)).ReadMultiple <Table1Entry>(header.table1EntryCount);

                //2nd table
                br.BaseStream.Position = header.offset2;
                table2Comp             = (byte)(br.ReadByte() & 7);
                br.BaseStream.Position--;
                var tmpT2 = br.ReadBytes((int)(header.fileEntryTableOffset - header.offset2));
                table2 = new BinaryReaderX(Support.DecompressToStream(tmpT2)).ReadMultiple <Table2Entry>(header.table2EntryCount);

                //File Entry Table
                br.BaseStream.Position = header.fileEntryTableOffset;
                entriesComp            = (byte)(br.ReadByte() & 7);
                br.BaseStream.Position--;
                entries = new BinaryReaderX(Support.DecompressToStream(br.ReadBytes((int)(header.nameTableOffset - header.fileEntryTableOffset))))
                          .ReadMultipleEntriesInc((int)header.fileEntryCount).ToList();

                //Name Table
                br.BaseStream.Position = header.nameTableOffset;
                nameC     = br.ReadBytes((int)(header.dataOffset - header.nameTableOffset));
                fileNames = GetFileNames(Level5.Decompress(new MemoryStream(nameC)));

                //Add Files
                List <uint> combs = new List <uint>();
                foreach (var name in fileNames)
                {
                    var crc32 = Crc32.Create(name.Split('/').Last(), Encoding.GetEncoding("SJIS"));
                    var entry = entries.Find(c => c.entry.crc32 == crc32 && !combs.Contains(c.entry.comb1));
                    combs.Add(entry.entry.comb1);
                    Files.Add(new XFSAFileInfo
                    {
                        State    = ArchiveFileState.Archived,
                        FileName = name,
                        FileData = new SubStream(br.BaseStream, header.dataOffset + ((entry.entry.comb1 & 0x01ffffff) << 4), entry.entry.comb2 & 0x000fffff),
                        entry    = entry
                    });
                }
            }
        }
コード例 #10
0
ファイル: TTBinAdapter.cs プロジェクト: DarkSynopsis/Kuriimu
        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 = Level5.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);
            }
        }
コード例 #11
0
ファイル: TTBIN.cs プロジェクト: DarkSynopsis/Kuriimu
        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 = Level5.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);
        }
コード例 #12
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 = Level5.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 = Level5.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
                    });
                }
            }
        }
コード例 #13
0
        public XF(Stream input)
        {
            using (var br = new BinaryReaderX(input))
            {
                //parse Header
                var header = br.ReadStruct <XpckHeader>();
                header.CorrectHeader();

                //parse FileEntries
                fileEntries = new List <FileEntry>();
                for (int i = 0; i < header.fileEntries; i++)
                {
                    fileEntries.Add(br.ReadStruct <FileEntry>());
                }

                //get xi image
                BinaryWriterX xi = new BinaryWriterX(new MemoryStream());
                br.BaseStream.Position = header.dataOffset + fileEntries[0].offset;
                xi.Write(br.ReadBytes(fileEntries[0].fileSize));
                xi.BaseStream.Position = 0;

                //convert xi image to bmp
                bmp = new IMGC(xi.BaseStream).Image;

                //get fnt.bin
                BinaryWriterX fnt = new BinaryWriterX(new MemoryStream());
                br.BaseStream.Position = header.dataOffset + fileEntries[0].fileSize + 4;
                fnt.Write(br.ReadBytes(fileEntries[1].fileSize));
                fnt.BaseStream.Position = 0;

                //decompress fnt.bin
                BinaryReaderX fntR = new BinaryReaderX(fnt.BaseStream);
                fntR.BaseStream.Position = 0x28;

                byte[] buf1 = Level5.Decompress(fntR.BaseStream);
                fntR.BaseStream.Position = (fntR.BaseStream.Position + 3) & ~3;
                byte[] buf2 = Level5.Decompress(fntR.BaseStream);
                fntR.BaseStream.Position = (fntR.BaseStream.Position + 3) & ~3;
                byte[] buf3 = Level5.Decompress(fntR.BaseStream);

                using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(buf1)))
                    lstCharSizeInfo = Enumerable.Range(0, buf1.Length / 4).Select(_ => br2.ReadStruct <CharSizeInfo>()).ToList();
                using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(buf2)))
                    dicGlyphLarge = Enumerable.Range(0, buf2.Length / 8).Select(i => br2.ReadStruct <CharacterMap>()).ToDictionary(x => x.code_point);
                using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(buf3)))
                    dicGlyphSmall = Enumerable.Range(0, buf3.Length / 8).Select(i => br2.ReadStruct <CharacterMap>()).ToDictionary(x => x.code_point);
            }
        }
コード例 #14
0
        public XS(string filename)
        {
            using (BinaryReaderX br = new BinaryReaderX(File.OpenRead(filename)))
            {
                //Header
                header = br.ReadStruct <Header>();

                //Table0
                br.BaseStream.Position  = header.table0Offset << 2;
                table0Comp              = (Level5.Method)(br.ReadInt32() & 0x7);
                br.BaseStream.Position -= 4;
                entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <Entry>(header.table0EntryCount);

                //Table2
                br.BaseStream.Position  = header.table1Offset << 2;
                table1Comp              = (Level5.Method)(br.ReadInt32() & 0x7);
                br.BaseStream.Position -= 4;
                subEntries              = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <SubEntry>(header.table1EntryCount);

                //Text
                br.BaseStream.Position  = header.stringTableOffset << 2;
                stringComp              = (Level5.Method)(br.ReadInt32() & 0x7);
                br.BaseStream.Position -= 4;
                using (var text = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))))
                {
                    var entryCount = 0;
                    foreach (var entry in entries)
                    {
                        for (int i = entry.subEntryOffset; i < entry.subEntryOffset + entry.subEntryCount; i++)
                        {
                            var subEntry = subEntries[i];
                            if (subEntry.ident == 0x18 && !offsets.Contains(subEntry.value))
                            {
                                text.BaseStream.Position = subEntry.value;
                                offsets.Add(subEntry.value);
                                Labels.Add(new Label
                                {
                                    Name   = $"{entryCount}:{i-entry.subEntryOffset}",
                                    TextID = i,
                                    Text   = text.ReadCStringSJIS()
                                });
                            }
                        }
                        entryCount++;
                    }
                }
            }
        }
コード例 #15
0
        public XS(string filename)
        {
            using (BinaryReaderX br = new BinaryReaderX(File.OpenRead(filename)))
            {
                //Header
                header = br.ReadStruct <Header>();

                //Table1
                table1 = br.ReadBytes((header.table2Offset << 2) - (header.table1Offset << 2));

                //Table2
                br.BaseStream.Position = header.table2Offset << 2;
                using (var table2 = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))))
                {
                    while (table2.BaseStream.Position < table2.BaseStream.Length)
                    {
                        entries.Add(table2.ReadStruct <T2Entry>());
                    }
                }
                br.BaseStream.Position = (br.BaseStream.Position + 3) & ~3;

                //Text
                if (br.BaseStream.Position < br.BaseStream.Length)
                {
                    using (var text = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))))
                    {
                        var count = 0;
                        foreach (var entry in entries)
                        {
                            if (entry.ident == 0x18 && !offsets.Contains(entry.textOffset))
                            {
                                offsets.Add(entry.textOffset);
                                text.BaseStream.Position = entry.textOffset;
                                Labels.Add(new Label
                                {
                                    Name   = $"text{count:000000}",
                                    TextID = count++,
                                    Text   = text.ReadCStringSJIS()
                                });
                            }
                        }
                    }
                }
            }
        }
コード例 #16
0
        public IMGC(Stream input)
        {
            using (var br = new BinaryReaderX(input))
            {
                //Header
                header = br.ReadStruct <Header>();
                if (header.imageFormat == 28 && header.bitDepth == 8)
                {
                    editMode           = true;
                    header.imageFormat = 29;
                }
                if (header.imageFormat == 0xb && header.bitDepth == 8)
                {
                    editMode2          = true;
                    header.imageFormat = 12;
                }

                //get tile table
                br.BaseStream.Position = header.tableDataOffset;
                var tableC = br.ReadBytes(header.tableSize1);
                tableComp = (Level5.Method)(tableC[0] & 0x7);
                byte[] table = Level5.Decompress(new MemoryStream(tableC));

                //get image data
                br.BaseStream.Position = header.tableDataOffset + header.tableSize2;
                var texC = br.ReadBytes(header.imgDataSize);
                picComp = (Level5.Method)(texC[0] & 0x7);
                byte[] tex = Level5.Decompress(new MemoryStream(texC));

                //order pic blocks by table
                byte[] pic = Order(new MemoryStream(table), new MemoryStream(tex));

                //return finished image
                settings = new ImageSettings
                {
                    Width   = header.width,
                    Height  = header.height,
                    Format  = Support.Format[header.imageFormat],
                    Swizzle = new ImgcSwizzle(header.width, header.height)
                };
                Image = Kontract.Image.Common.Load(pic, settings);
            }
        }
コード例 #17
0
ファイル: XpckManager.cs プロジェクト: benladen/Kuriimu
        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 = Level5.Decompress(br.BaseStream); } catch { return(false); }
                return(new BinaryReaderX(new MemoryStream(decomp)).ReadString(4) == "XPCK");
            }
        }
コード例 #18
0
        public XS(string filename)
        {
            using (BinaryReaderX br = new BinaryReaderX(File.OpenRead(filename)))
            {
                //Header
                header = br.ReadStruct <Header>();

                //Table0
                br.BaseStream.Position  = header.table0Offset << 2;
                table0Comp              = (Level5.Method)(br.ReadInt32() & 0x7);
                br.BaseStream.Position -= 4;
                table0 = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <T0Entry>(header.table0EntryCount);

                //Table2
                br.BaseStream.Position  = header.table1Offset << 2;
                table1Comp              = (Level5.Method)(br.ReadInt32() & 0x7);
                br.BaseStream.Position -= 4;
                entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <VarStruct>(header.table1EntryCount);

                //Text
                br.BaseStream.Position  = header.stringTableOffset << 2;
                stringComp              = (Level5.Method)(br.ReadInt32() & 0x7);
                br.BaseStream.Position -= 4;
                using (var text = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))))
                {
                    var count = 0;
                    foreach (var entry in entries)
                    {
                        if (entry.ident == 0x18 && !offsets.Contains(entry.value))
                        {
                            offsets.Add(entry.value);
                            text.BaseStream.Position = entry.value;
                            Labels.Add(new Label
                            {
                                Name   = $"text{count:000000}",
                                TextID = count++,
                                Text   = text.ReadCStringSJIS()
                            });
                        }
                    }
                }
            }
        }
コード例 #19
0
ファイル: ARC0.cs プロジェクト: wabberz/Kuriimu
        public ARC0(Stream input)
        {
            _stream = input;
            using (BinaryReaderX br = new BinaryReaderX(input, true))
            {
                //Header
                header = br.ReadStruct <Header>();

                //Table 1
                br.BaseStream.Position = header.offset1;
                table1 = br.ReadBytes((int)(header.offset2 - header.offset1));

                //Table 2
                br.BaseStream.Position = header.offset2;
                table2 = br.ReadBytes((int)(header.fileEntriesOffset - header.offset2));

                //File Entry Table
                br.BaseStream.Position = header.fileEntriesOffset;
                entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(new MemoryStream(br.ReadBytes((int)(header.nameOffset - header.fileEntriesOffset))))))
                          .ReadMultiple <FileEntry>(header.fileEntriesCount);

                //NameTable
                br.BaseStream.Position = header.nameOffset;
                nameC     = br.ReadBytes((int)(header.dataOffset - header.nameOffset));
                fileNames = GetFileNames(Level5.Decompress(new MemoryStream(nameC)));

                //Add Files
                List <uint> offsets = new List <uint>();
                foreach (var name in fileNames)
                {
                    var crc32 = Crc32.Create(name.Split('/').Last(), Encoding.GetEncoding("SJIS"));
                    var entry = entries.Find(c => c.crc32 == crc32 && !offsets.Contains(c.fileOffset));
                    offsets.Add(entry.fileOffset);
                    Files.Add(new ARC0FileInfo
                    {
                        State    = ArchiveFileState.Archived,
                        FileName = name,
                        FileData = new SubStream(br.BaseStream, header.dataOffset + entry.fileOffset, entry.fileSize),
                        entry    = entry
                    });
                }
            }
        }
コード例 #20
0
        public XFSA(string filename)
        {
            using (var br = new BinaryReaderX(File.OpenRead(filename), true))
            {
                //Header
                header = br.ReadStruct <Header>();

                //1st table
                br.BaseStream.Position = header.offset1;
                table1 = br.ReadBytes((int)(header.offset2 - header.offset1));

                //2nd table
                br.BaseStream.Position = header.offset2;
                table2 = br.ReadBytes((int)(header.fileEntryTableOffset - header.offset2));

                //File Entry Table
                br.BaseStream.Position = header.fileEntryTableOffset;
                entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(new MemoryStream(br.ReadBytes((int)(header.nameTableOffset - header.fileEntryTableOffset))))))
                          .ReadMultiple <FileEntry>((int)header.fileEntryCount);

                //Name Table
                br.BaseStream.Position = header.nameTableOffset;
                nameC     = br.ReadBytes((int)(header.dataOffset - header.nameTableOffset));
                fileNames = GetFileNames(Level5.Decompress(new MemoryStream(nameC)));

                //Add Files
                List <uint> combs = new List <uint>();
                foreach (var name in fileNames)
                {
                    var crc32 = Crc32.Create(name.Split('/').Last(), Encoding.GetEncoding("SJIS"));
                    var entry = entries.Find(c => c.crc32 == crc32 && !combs.Contains(c.comb1));
                    combs.Add(entry.comb1);
                    Files.Add(new XFSAFileInfo
                    {
                        State    = ArchiveFileState.Archived,
                        FileName = name,
                        FileData = new SubStream(br.BaseStream, header.dataOffset + ((entry.comb1 & 0x01ffffff) << 4), entry.comb2 & 0x000fffff),
                        entry    = entry
                    });
                }
            }
        }
コード例 #21
0
ファイル: XI.cs プロジェクト: Moonstriker/Kuriimu
        public static Bitmap Load(Stream input)
        {
            using (var br = new BinaryReaderX(input))
            {
                //Header
                header = br.ReadStruct <Header>();
                if (header.imageFormat == Format.ETC1 && header.bitDepth == 8)
                {
                    editMode           = true;
                    header.imageFormat = Format.ETC1A4;
                }

                //get tile table
                br.BaseStream.Position = header.tableDataOffset;
                var tableC = br.ReadBytes(header.tableSize1);
                tableComp = (Level5.Method)(tableC[0] & 0x7);
                byte[] table = Level5.Decompress(new MemoryStream(tableC));

                //get image data
                br.BaseStream.Position = header.tableDataOffset + header.tableSize2;
                var texC = br.ReadBytes(header.imgDataSize);
                picComp = (Level5.Method)(texC[0] & 0x7);
                byte[] tex = Level5.Decompress(new MemoryStream(texC));

                //order pic blocks by table
                byte[] pic = Order(new MemoryStream(table), new MemoryStream(tex));

                //return finished image
                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));
            }
        }
コード例 #22
0
        public IMGV(Stream input)
        {
            using (var br = new BinaryReaderX(input))
            {
                //Header
                header = br.ReadStruct <Header>();

                //get tile table
                br.BaseStream.Position = header.tableDataOffset;
                var tableC = br.ReadBytes(header.tableSize1);
                tableComp = (Level5.Method)(tableC[0] & 0x7);
                byte[] table = Level5.Decompress(new MemoryStream(tableC));

                //get image data
                br.BaseStream.Position = header.tableDataOffset + header.tableSize2;
                var texC = br.ReadBytes(header.imgDataSize);
                picComp = (Level5.Method)(texC[0] & 0x7);
                byte[] tex = Level5.Decompress(new MemoryStream(texC));

                //order pic blocks by table
                byte[] pic = Order(new MemoryStream(table), new MemoryStream(tex), header.bitDepth);

                //File.WriteAllBytes(@"D:\Users\Kirito\Desktop\xi_data.bin", pic);

                //return finished image
                var isBlockCompression = Support.Format[header.imageFormat].FormatName.Contains("DXT");
                settings = new ImageSettings
                {
                    Width   = header.width,
                    Height  = header.height,
                    Format  = Support.Format[header.imageFormat],
                    Swizzle = isBlockCompression ? new Support.BlockSwizzle(header.width, header.height) : null
                };
                Image = Kontract.Image.Common.Load(pic, settings);
            }
        }
コード例 #23
0
ファイル: XF.cs プロジェクト: ultramario1998/Kuriimu2
        public XF(Stream input)
        {
            using (var br = new BinaryReaderX(input))
            {
                //load files
                xpck = new XPCK(input);

                //get xi image to bmp
                xi  = new IMGC(xpck.Files[0].FileData);
                bmp = xi.Image;

                //decompress fnt.bin
                var tempCharSizeInfo = new List <CharSizeInfo>();
                var largeChars       = new List <CharacterMap>();
                var smallChars       = new List <CharacterMap>();
                using (var fntR = new BinaryReaderX(xpck.Files[1].FileData, true))
                {
                    Header = fntR.ReadType <XFHeader>();

                    fntR.BaseStream.Position = Header.table0Offset << 2;
                    t0Comp = (Level5.Method)(fntR.ReadInt32() & 0x7);
                    fntR.BaseStream.Position -= 4;
                    tempCharSizeInfo          = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharSizeInfo>(Header.table0EntryCount);

                    fntR.BaseStream.Position = Header.table1Offset << 2;
                    t1Comp = (Level5.Method)(fntR.ReadInt32() & 0x7);
                    fntR.BaseStream.Position -= 4;
                    largeChars = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(Header.table1EntryCount);

                    fntR.BaseStream.Position = Header.table2Offset << 2;
                    t2Comp = (Level5.Method)(fntR.ReadInt32() & 0x7);
                    fntR.BaseStream.Position -= 4;
                    smallChars = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(Header.table2EntryCount);
                }

                Textures = new List <Bitmap>();
                var bmpInfo = new BitmapInfo(bmp);
                Textures.Add(bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Red));
                Textures.Add(bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Green));
                Textures.Add(bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Blue));

                //Add Characters
                Characters = new List <XFCharacter>();
                foreach (var glyph in largeChars)
                {
                    var newChar = new XFCharacter
                    {
                        Character      = glyph.code_point,
                        TextureID      = (int)glyph.ColorChannel,
                        GlyphX         = (int)glyph.ImageOffsetX,
                        GlyphY         = (int)glyph.ImageOffsetY,
                        GlyphWidth     = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_width,
                        GlyphHeight    = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_height,
                        CharacterWidth = (int)glyph.CharWidth,
                        OffsetX        = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_x,
                        OffsetY        = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_y,
                    };
                    Characters.Add(newChar);
                }

                /*foreach (var glyph in smallChars)
                 *  Characters.Add(new XFCharacter
                 *  {
                 *      Character = glyph.code_point,
                 *      TextureID = (int)glyph.ColorChannel,
                 *      GlyphX = (int)glyph.ImageOffsetX,
                 *      GlyphY = (int)glyph.ImageOffsetY,
                 *      GlyphWidth = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_width,
                 *      GlyphHeight = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_height,
                 *      CharacterWidth = (int)glyph.CharWidth,
                 *      OffsetX = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_x,
                 *      OffsetY = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_y,
                 *  });*/

                //Add Textures
            }
        }
コード例 #24
0
        public static void Decompress(object sender, EventArgs e)
        {
            var tsi = sender as ToolStripMenuItem;

            if (!Shared.PrepareFiles("Open a " + tsi?.Tag + " compressed file...", "Save your decompressed file...", ".decomp", out var openFile, out var saveFile))
            {
                return;
            }

            try
            {
                using (openFile)
                    using (var outFs = new BinaryWriterX(saveFile))
                        switch (tsi?.Tag)
                        {
                        case Compression.Level5:
                            outFs.Write(Level5.Decompress(openFile));
                            break;

                        case Compression.Nintendo:
                            outFs.Write(Nintendo.Decompress(openFile));
                            break;

                        case Compression.LZ77:
                            outFs.Write(LZ77.Decompress(openFile));
                            break;

                        case Compression.RevLZ77:
                            outFs.Write(RevLZ77.Decompress(openFile));
                            break;

                        case Compression.LZOvl:
                            outFs.Write(LZOvl.Decompress(openFile));
                            break;

                        case Compression.LZ4:
                            outFs.Write(Kontract.Compression.LZ4.Decompress(openFile));
                            break;

                        case Compression.MIO0LE:
                            outFs.Write(MIO0.Decompress(openFile, ByteOrder.LittleEndian));
                            break;

                        case Compression.MIO0BE:
                            outFs.Write(MIO0.Decompress(openFile, ByteOrder.BigEndian));
                            break;

                        case Compression.Yay0LE:
                            outFs.Write(Yay0.Decompress(openFile, ByteOrder.LittleEndian));
                            break;

                        case Compression.Yay0BE:
                            outFs.Write(Yay0.Decompress(openFile, ByteOrder.BigEndian));
                            break;

                        case Compression.Yaz0LE:
                            outFs.Write(Yaz0.Decompress(openFile, ByteOrder.LittleEndian));
                            break;

                        case Compression.Yaz0BE:
                            outFs.Write(Yaz0.Decompress(openFile, ByteOrder.BigEndian));
                            break;

                        case Compression.LZECD:
                            outFs.Write(LZECD.Decompress(openFile));
                            break;

                        case Compression.LZ10VLE:
                            outFs.Write(LZSSVLE.Decompress(openFile));
                            break;

                        case Compression.GZip:
                            outFs.Write(GZip.Decompress(openFile));
                            break;

                        case Compression.ZLib:
                            outFs.Write(ZLib.Decompress(openFile));
                            break;

                        case Compression.PSVSpikeChun:
                            outFs.Write(PSVSpikeChun.Decompress(openFile));
                            break;
                        }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), tsi?.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            MessageBox.Show($"Successfully decompressed {Path.GetFileName(openFile.Name)}.", tsi.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
コード例 #25
0
ファイル: XiSupport.cs プロジェクト: DarkSynopsis/Kuriimu
 public static byte[] Decomp(BinaryReaderX br)
 {
     // above to be restored eventually with some changes to Cetera
     return(Level5.Decompress(br.BaseStream));
 }
コード例 #26
0
ファイル: Compression.cs プロジェクト: benladen/Kuriimu
        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.Level5:
                            outFs.Write(Level5.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);
        }
コード例 #27
0
        public XF(Stream input)
        {
            using (var br = new BinaryReaderX(input))
            {
                xpck = new XPCK(input);

                //get xi image to bmp
                xi  = new IMGC(xpck.Files[0].FileData);
                bmp = xi.Image;

                //decompress fnt.bin
                var tempCharSizeInfo = new List <CharSizeInfo>();
                using (var fntR = new BinaryReaderX(xpck.Files[1].FileData, true))
                {
                    xfheader = fntR.ReadStruct <XFHeader>();

                    fntR.BaseStream.Position = xfheader.table0Offset << 2;
                    t0Comp = (Level5.Method)(fntR.ReadInt32() & 0x7);
                    fntR.BaseStream.Position -= 4;
                    tempCharSizeInfo          = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharSizeInfo>(xfheader.table0EntryCount);

                    fntR.BaseStream.Position = xfheader.table1Offset << 2;
                    t1Comp = (Level5.Method)(fntR.ReadInt32() & 0x7);
                    fntR.BaseStream.Position -= 4;
                    dicGlyphLarge             = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(xfheader.table1EntryCount).ToDictionary(x => x.code_point);

                    fntR.BaseStream.Position = xfheader.table2Offset << 2;
                    t2Comp = (Level5.Method)(fntR.ReadInt32() & 0x7);
                    fntR.BaseStream.Position -= 4;
                    dicGlyphSmall             = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(xfheader.table2EntryCount).ToDictionary(x => x.code_point);
                }

                #region Expand charsizeinfo
                lstCharSizeInfoLarge = new Dictionary <char, CharSizeInfo>();
                lstCharSizeInfoSmall = new Dictionary <char, CharSizeInfo>();
                foreach (var dic in dicGlyphLarge)
                {
                    lstCharSizeInfoLarge.Add(dic.Value.code_point, new CharSizeInfo
                    {
                        offset_x    = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].offset_x,
                        offset_y    = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].offset_y,
                        char_width  = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].char_width,
                        char_height = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].char_height
                    });
                }
                foreach (var dic in dicGlyphSmall)
                {
                    lstCharSizeInfoSmall.Add(dic.Value.code_point, new CharSizeInfo
                    {
                        offset_x    = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].offset_x,
                        offset_y    = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].offset_y,
                        char_width  = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].char_width,
                        char_height = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].char_height
                    });
                }
                #endregion

                var bmpInfo = new BitmapInfo(bmp);

                image_0 = bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Red);
                image_1 = bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Green);
                image_2 = bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Blue);
            }
        }
コード例 #28
0
ファイル: ARC0.cs プロジェクト: benladen/Kuriimu
        public ARC0(Stream input)
        {
            _stream = input;
            using (BinaryReaderX br = new BinaryReaderX(input, true))
            {
                //Header
                header = br.ReadStruct <ARC0Header>();

                unk1 = br.ReadBytes(header.offset1 - header.offset0);
                unk2 = br.ReadBytes(header.offset2 - header.offset1);

                //Entries
                entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(new MemoryStream(br.ReadBytes(header.nameOffset - header.offset2))))).ReadMultiple <ARC0Entry>(header.fileCount);

                //Names
                using (var nl = new BinaryReaderX(new MemoryStream(Level5.Decompress(new MemoryStream(br.ReadBytes(header.dataOffset - header.nameOffset))))))
                {
                    string currentFolder = "";
                    nl.BaseStream.Position++;
                    string tmp = nl.ReadCStringSJIS();
                    nl.BaseStream.Position--;
                    fileNames = new List <string>();
                    folderCounts.Add(0);

                    while (tmp != "" && nl.BaseStream.Position < nl.BaseStream.Length)
                    {
                        if (tmp.Last() == '/')
                        {
                            folderCounts.Add(0);
                            dirStruct.Add(tmp);
                            currentFolder = tmp;
                        }
                        else
                        {
                            dirStruct.Add(currentFolder + tmp);
                            fileNames.Add(currentFolder + tmp);
                            folderCounts[folderCounts.Count - 1] += 1;
                        }

                        nl.BaseStream.Position++;
                        if (nl.BaseStream.Position < nl.BaseStream.Length)
                        {
                            tmp = nl.ReadCStringSJIS();
                            nl.BaseStream.Position--;
                        }
                    }
                }

                //FileData
                int pos = 0;
                foreach (var folderCount in folderCounts)
                {
                    var tmpFiles = new List <ARC0NameEntry>();
                    for (int i = 0; i < folderCount; i++)
                    {
                        tmpFiles.Add(new ARC0NameEntry
                        {
                            name  = fileNames[pos + i],
                            crc32 = Crc32.Create(Encoding.GetEncoding("SJIS").GetBytes(fileNames[pos + i].Split('/').Last().ToLower()))
                        });
                    }
                    tmpFiles = tmpFiles.OrderBy(x => x.crc32).ToList();

                    foreach (var nameEntry in tmpFiles)
                    {
                        if (nameEntry.crc32 == entries[pos].crc32)
                        {
                            Files.Add(new ARC0FileInfo
                            {
                                State    = ArchiveFileState.Archived,
                                FileName = nameEntry.name,
                                FileData = new SubStream(br.BaseStream, entries[pos].fileOffset + header.dataOffset, entries[pos].fileSize),
                                crc32    = entries[pos++].crc32
                            });
                        }
                    }
                }
            }
        }
コード例 #29
0
 public static Stream DecompressToStream(byte[] input) => new MemoryStream(Level5.Decompress(new MemoryStream(input)));