Esempio n. 1
0
        private void LoadHeader()
        {
            reader.Seek(8);
            uint count = reader.ReadUInt32();

            fileInfos = new List <ArchivedFileInfo>();
            reader.Seek(92);

            for (int fileIndex = 0; fileIndex < count; fileIndex++)
            {
                byte[] buffer = new byte[16];
                for (int i = 0; i < 16; i++)
                {
                    buffer[i] = reader.ReadByte();
                }
                string filename = System.Text.Encoding.ASCII.GetString(buffer);

                filename = filename.Substring(0, filename.IndexOf('\0'));
                uint offset      = reader.ReadUInt32();
                uint size        = reader.ReadUInt32();
                uint placeholder = reader.ReadUInt32();
                uint csize       = reader.ReadUInt32();

                ArchivedFileInfo info = new ArchivedFileInfo();
                info.FileName = filename;
                info.Offset   = offset;
                info.Size     = size;
                info.CSize    = csize;

                fileInfos.Add(info);
            }
        }
Esempio n. 2
0
        public void DumpAllFiles(string outputFolder)
        {
            for (int fileIndex = 0; fileIndex < fileInfos.Count; fileIndex++)
            {
                ArchivedFileInfo info = fileInfos[fileIndex];

                Dump(info, outputFolder);
            }
        }
Esempio n. 3
0
        public void DumpFile(string fileName, string outputFolder)
        {
            for (int fileIndex = 0; fileIndex < fileInfos.Count; fileIndex++)
            {
                ArchivedFileInfo info = fileInfos[fileIndex];

                if (info.FileName.Equals(fileName, StringComparison.InvariantCultureIgnoreCase))
                {
                    Dump(info, outputFolder);
                }
            }
        }
Esempio n. 4
0
        private void Dump(ArchivedFileInfo fileInfo, string outputFolder)
        {
            try
            {
                Directory.CreateDirectory(outputFolder);
            }
            catch (Exception)
            {
                ///
            }

            reader.Seek((int)fileInfo.Offset);
            byte[] content;

            string filename = Path.Combine(outputFolder, fileInfo.FileName);
            string ext      = Path.GetExtension(filename);

            if (Path.GetExtension(filename) == ".pcx")
            {
                filename = Path.ChangeExtension(filename, ".png");
            }

            using (MemoryStream outputStream = new MemoryStream())
            {
                if (fileInfo.CSize > 0)
                {
                    content = reader.ReadBytes((int)fileInfo.CSize);
                    MemoryStream inputStream = new MemoryStream(content);
                    DecompressStream(inputStream, outputStream);
                }
                else
                {
                    content = reader.ReadBytes((int)fileInfo.Size);
                    outputStream.Write(content, 0, content.Length);
                }

                using (var outputFile = new FileStream(filename, FileMode.Create, FileAccess.Write))
                {
                    outputStream.Seek(0, SeekOrigin.Begin);

                    if (H3PcxFileHandler.IsPCX(outputStream))
                    {
                        ImageData image = H3PcxFileHandler.ExtractPCXStream(outputStream);
                        image.SaveAsPng(outputFile);
                    }
                    else
                    {
                        outputStream.CopyTo(outputFile);
                    }
                }
            }
        }
Esempio n. 5
0
        static void Test()
        {
            // BinaryReader reader = new BinaryReader(@"D:\PlayGround\SOD_Data\h3ab_bmp.lod");
            BinaryReader reader = null;

            reader.Skip(8);
            uint count = reader.ReadUInt32();

            Console.WriteLine("Total count: " + count);

            List <ArchivedFileInfo> fileList = new List <ArchivedFileInfo>();

            reader.Seek(92);
            for (int fileIndex = 0; fileIndex < count; fileIndex++)
            {
                byte[] buffer = new byte[16];
                for (int i = 0; i < 16; i++)
                {
                    buffer[i] = reader.ReadByte();
                }
                string filename = System.Text.Encoding.ASCII.GetString(buffer);

                filename = filename.Substring(0, filename.IndexOf('\0'));
                uint offset      = reader.ReadUInt32();
                uint size        = reader.ReadUInt32();
                uint placeholder = reader.ReadUInt32();
                uint csize       = reader.ReadUInt32();

                Console.WriteLine(string.Format("[{4}] filename:{0} offset:{1} size:{2} csize:{3}", filename, offset, size, csize, fileIndex));

                ArchivedFileInfo info = new ArchivedFileInfo();
                info.FileName = filename;
                info.Offset   = offset;
                info.Size     = size;
                info.CSize    = csize;

                fileList.Add(info);
            }

            Directory.CreateDirectory(@".\output\");

            Directory.CreateDirectory(@".\output\extracted\");

            for (int fileIndex = 0; fileIndex < count; fileIndex++)
            {
                ArchivedFileInfo info = fileList[fileIndex];

                //// reader.Seek(info.Offset);
                byte[] content;
                string filename = @".\output\" + info.FileName;
                if (info.CSize > 0)
                {
                    filename = filename + ".zip";
                    content  = reader.ReadBytes((int)info.CSize);
                }
                else
                {
                    content = reader.ReadBytes((int)info.Size);
                }

                using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
                {
                    fs.Write(content, 0, content.Length);
                }

                //// Thread.Sleep(500);
                Console.WriteLine("Finished writing file " + filename);

                if (filename.EndsWith(".h3c"))
                {
                    /*
                     * //ZipFile.ExtractToDirectory(filename, @"D:\Temp\ab.h3c");
                     * int length = 100000;
                     * byte[] data = new byte[length];
                     * for (int i = 0; i < length; i++)
                     * {
                     *  data[i] = System.Convert.ToByte(i % 100 + i % 50);
                     * }
                     *
                     * byte[] o;
                     * //serialization into memory stream
                     * IFormatter formatter = new BinaryFormatter();
                     *
                     * using (FileStream decompressedFileStream = File.Create(filename + ".origin"))
                     * {
                     *  using (FileStream file = new FileStream(filename, FileMode.Open, FileAccess.Read))
                     *  {
                     *      using (GZipStream decompressionStream = new GZipStream(file, CompressionMode.Decompress, true))
                     *      {
                     *          int dstreamlength = 0;
                     *          while(decompressionStream.ReadByte() >= 0)
                     *          {
                     *              dstreamlength++;
                     *          }
                     *
                     *          Console.WriteLine("GZip Decompressed length: " + dstreamlength);
                     *
                     *          ///DecompressFile(@".\output\extracted\", decompressionStream);
                     *          // decompressionStream.CopyTo(decompressedFileStream);///
                     *
                     *          Console.WriteLine("Decompressed: {0}", filename);
                     *      }
                     *
                     *
                     *      file.Seek(0, SeekOrigin.Begin);
                     *      var oo = formatter.Deserialize(decompressedFileStream);
                     *      o = (byte[])oo;
                     *
                     *  }
                     * }
                     */
                }

                if (info.CSize > 0)
                {
                    ////ZipFile.ExtractToDirectory(filename, @"D:\Temp");
                    //// ZipFile.ExtractToDirectory(filename, filename.Substring(0, 5));



                    using (FileStream decompressedFileStream = File.Create(filename + ".origin"))
                    {
                        using (FileStream file = new FileStream(filename, FileMode.Open, FileAccess.Read))
                        {
                            using (DeflateStream decompressionStream = new DeflateStream(file, CompressionMode.Decompress, true))
                            {
                                decompressionStream.CopyTo(decompressedFileStream);
                                Console.WriteLine("Decompressed: {0}", filename);
                            }

                            /*
                             * using (GZipStream decompressionStream = new GZipStream(file, CompressionMode.Decompress, false))
                             * {
                             *  decompressionStream.CopyTo(decompressedFileStream);
                             *  Console.WriteLine("Decompressed: {0}", filename);
                             * }
                             */
                        }
                    }
                }
            }
        }