示例#1
0
        private static byte[] DecompressData(FileReader reader, string FileName, byte[] data)
        {
            reader.ByteOrder = ByteOrder.BigEndian;
            reader.Position  = 0;
            uint   MagicHex = reader.ReadUInt32();
            string Magic    = reader.ReadMagic(0, 4);

            reader.Position = 0;

            if (Magic == "Yaz0")
            {
                if (data != null)
                {
                    return(EveryFileExplorer.YAZ0.Decompress(data));
                }
                else
                {
                    return(EveryFileExplorer.YAZ0.Decompress(FileName));
                }
            }
            if (MagicHex == 0x28B52FFD || MagicHex == 0xFD2FB528)
            {
                if (data != null)
                {
                    return(Zstb.SDecompress(data));
                }
                else
                {
                    return(Zstb.SDecompress(File.ReadAllBytes(FileName)));
                }
            }

            return(data);
        }
示例#2
0
        public void DecompressNameBlock(uint magic, byte[] CompressedBlock, SDFTOC_Header header)
        {
            byte[] decomp = null;
            if (magic == 0xDFF25B82 || magic == 0xFD2FB528)
            {
                decomp = Zstb.SDecompress(CompressedBlock);
            }
            else if (magic == 0x184D2204 || header.Version >= 0x17)
            {
                decomp = STLibraryCompression.Type_LZ4.Decompress(CompressedBlock, 0, CompressedBlock.Length, (int)header.DecompressedSize);
            }
            else
            {
                decomp = STLibraryCompression.ZLIB.Decompress(CompressedBlock);
            }

            //Now it's decompressed lets parse!
            using (var reader = new FileReader(decomp))
            {
                ParseNames(reader);
            }

            CompressedBlock = new byte[0];
            decomp          = new byte[0];
            decomp          = null;
            CompressedBlock = null;
        }
示例#3
0
 public static void SetASST(FileEntry fileEntry, byte[] data)
 {
     if (fileEntry.IsCompressed)
     {
         fileEntry.CompressedData = Zstb.SCompress(data);
     }
     else
     {
         fileEntry.CompressedData = data;
     }
 }
示例#4
0
 public static byte[] GetASSTData(FileEntry entry)
 {
     if (entry.IsCompressed)
     {
         return(Zstb.SDecompress(entry.CompressedData));
     }
     else
     {
         return(entry.CompressedData);
     }
 }
示例#5
0
            public byte[] GetFileBytes()
            {
                List <byte[]> Data = new List <byte[]>();

                if (File.Exists(FileBlockPath))
                {
                    var block = File.Open(FileBlockPath, FileMode.Open);
                    using (var stream = new FileReader(block))
                    {
                        if (CompressedSizes.Count == 0)
                        {
                            //Decompressed File
                            //     string FileNameBlock = Path.Combine(FolderPath, FileName);
                            //    string FolerPath = Path.GetDirectoryName(FileNameBlock);
                            //    if (!Directory.Exists(FolerPath))
                            //        Directory.CreateDirectory(FolerPath);

                            Data.Add(stream.getSection((int)Offset, (int)DecompressedSize));
                        }
                        else
                        {
                            var PageSize     = (double)0x10000;
                            var DecompOffset = 0;
                            var CompOffset   = 0;
                            IsCompressed = true;

                            if (UseDDS)
                            {
                                bool IsDX10 = false;
                                using (var filereader = new FileReader(SDFParent.block2Array[DdsType].Data))
                                {
                                    filereader.Position = 84;
                                    IsDX10 = filereader.ReadString(4) == "DX10";

                                    if (IsDX10)
                                    {
                                        if (SDFParent.block2Array[DdsType].UsedBytes > 0x94)
                                        {
                                            IsSwizzled = true;
                                        }

                                        Data.Add(SDFParent.block2Array[DdsType].Data.Take((int)0x94).ToArray());
                                    }
                                    else
                                    {
                                        if (SDFParent.block2Array[DdsType].UsedBytes > 0x80)
                                        {
                                            IsSwizzled = true;
                                        }

                                        Data.Add(SDFParent.block2Array[DdsType].Data.Take((int)0x80).ToArray());
                                    }
                                }

                                Console.WriteLine("UsedBytes " + SDFParent.block2Array[DdsType].UsedBytes + " IsSwizzled " + IsSwizzled);
                            }

                            for (var i = 0; i < CompressedSizes.Count; i++)
                            {
                                var decompSize = (int)Math.Min((int)DecompressedSize - DecompOffset, PageSize);
                                if (CompressedSizes[i] == 0 || decompSize == (int)CompressedSizes[i])
                                {
                                    stream.Seek((int)Offset + CompOffset, SeekOrigin.Begin);
                                    CompressedSizes[i] = (ulong)decompSize;
                                    Data.Add(stream.ReadBytes(decompSize));
                                }
                                else
                                {
                                    stream.Seek((int)Offset + CompOffset, SeekOrigin.Begin);
                                    Data.Add(Zstb.SDecompress(stream.ReadBytes((int)CompressedSizes[i])));
                                }
                                DecompOffset += (int)decompSize;
                                CompOffset   += (int)CompressedSizes[i];
                            }
                        }
                    }

                    block.Dispose();
                }

                return(Utils.CombineByteArray(Data.ToArray()));
            }