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); } }
public void DumpAllFiles(string outputFolder) { for (int fileIndex = 0; fileIndex < fileInfos.Count; fileIndex++) { ArchivedFileInfo info = fileInfos[fileIndex]; Dump(info, outputFolder); } }
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); } } }
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); } } } }
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); * } */ } } } } }