Exemple #1
0
        public void uncomress(EndiannessAwareBinaryReader reader, BinaryWriter writer, Int32 size)
        {
            bool accurate = true;

            SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder();
            Int64 begin             = writer.BaseStream.Position;
            Int32 shift_back        = version == 12 ? 7 : 9;
            Int32 uncompressed_size = version == 12 ? 0x100000 : 0x8000;
            Int32 properties_value  = version == 12 ? 171 : 93;

            while (writer.BaseStream.Position - begin < size)
            {
                Int32 chunk_size = 0;
                if (!accurate)
                {
                    chunk_size = reader.ReadInt32();
                }
                else
                {
                    chunk_size = (Int32)round((UInt32)reader.ReadInt32()) - shift_back;
                }
                byte[] properties = reader.ReadBytes(5);
                if (properties[0] != properties_value || BitConverter.ToInt32(properties, 1) != uncompressed_size)
                {
                    reader.BaseStream.Position -= shift_back;
                    writer.Write(reader.ReadBytes(uncompressed_size));
                }
                else
                {
                    coder.SetDecoderProperties(properties);
                    coder.Code(reader.BaseStream, writer.BaseStream, chunk_size, Math.Min(uncompressed_size, size - (writer.BaseStream.Position - begin)), null);
                    writer.Write(reader.ReadBytes((int)(round((UInt32)reader.BaseStream.Position) - reader.BaseStream.Position)));
                }
            }
        }
Exemple #2
0
        public IGA(String path, EndiannessAwareBinaryReader.Endianness endianness)
        {
            FileStream iga_file = new FileStream(path, FileMode.Open, FileAccess.Read);
            EndiannessAwareBinaryReader reader = new EndiannessAwareBinaryReader(iga_file, endianness);

            signature     = reader.ReadInt32();
            version       = reader.ReadInt32();
            info_size     = reader.ReadInt32();
            files_count   = reader.ReadInt32();
            chunk_size    = reader.ReadInt32();
            magic_number1 = reader.ReadInt32();
            magic_number2 = reader.ReadInt32();
            zero1         = reader.ReadInt32();
            table1_size   = reader.ReadInt32();
            table2_size   = reader.ReadInt32();
            if (version == 11 || version == 10) //Skylanders SuperChargers WiiU Big Endian
            {
                zero2        = reader.ReadInt32();
                names_offset = reader.ReadUInt32();
            }
            else
            {
                names_offset = reader.ReadUInt32();
                zero2        = reader.ReadInt32();
            }
            names_size = reader.ReadInt32();
            one        = reader.ReadInt32();
            for (int i = 0; i < files_count; ++i)
            {
                file.Add(new File());
                file[i].setID(reader.ReadInt32());
                file[i].setSource(path);
            }
            for (int i = 0; i < files_count; ++i)
            {
                if (version == 11 || version == 10)
                {
                    file[i].setOrdinal(reader.ReadInt32());
                    file[i].setOffset(reader.ReadUInt32());
                }
                else
                {
                    file[i].setOffset(reader.ReadUInt32());
                    file[i].setOrdinal(reader.ReadInt32());
                }
                file[i].setSize(reader.ReadInt32());
                file[i].setCompression(reader.ReadInt32());
                file[i].setSourceOffset(file[i].getOffset());
            }
            for (int i = 0; i < table1_size; ++i)
            {
                mc_table.Add(reader.ReadUInt16());
            }
            for (int i = 0; i < table2_size / 2; ++i)
            {
                sc_table.Add(reader.ReadUInt16());
            }
            //Size: 920944
            //Ordinal: 606208
            // max: 33 499
            reader.BaseStream.Position = names_offset;
            Int32[] name_offsets = new Int32[files_count];
            for (int i = 0; i < files_count; ++i)
            {
                name_offsets[i] = reader.ReadInt32();
            }
            for (int i = 0; i < files_count; ++i)
            {
                reader.BaseStream.Position = names_offset + name_offsets[i];
                if (version == 10)
                {
                    String rel_name = "";
                    rel_name = readString(reader);
                    file[i].setFullName(rel_name);
                    file[i].setRelName(rel_name);
                }
                else
                {
                    String full_name = ""; String rel_name = "";
                    full_name = readString(reader);
                    rel_name  = readString(reader);
                    file[i].setFullName(full_name);
                    file[i].setRelName(rel_name);
                }
            }
            reader.Close();
        }