分析压缩或任何归档文件

3

我想知道是否有人能推荐一种分析压缩文件或任何存档文件的工具。 我的意思不是检查存档文件里面包含什么,而是更多关于它是如何被压缩的,使用了什么压缩方法等方面的信息。

谢谢!


如果你正在使用Linux/Mac OS X或类似的Unix变体,那么'file'命令怎么样?该命令应该能够识别您投入其中的任何压缩存档的类型,可能还包括压缩方法。如果这还不够,请问您能否缩小您所寻找的范围? - Multimedia Mike
2个回答

4

1
+1 我离解决为何我的用 PHP 下载的压缩文件无法打开又进了一步。zipinfo: 压缩文件开头或内部出现了 1 个额外的字节。谢谢! - Neo

1
我最近遇到了一个问题,由一个工具创建的zip文件只能用某些程序打开而不能用其他程序打开。问题原因是在zip文件中没有目录条目,它们只是由其中的文件存在隐含表示。此外,所有的目录分隔符都是反斜杠而不是正斜杠。
zipinfo对这些部分没有帮助。我需要查看zip条目,所以最终编写了以下内容,它允许我将目录条目与已知的好版本进行比较。
using System;
using System.IO;
using System.Text;

namespace ZipAnalysis
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("No filename specified");
                Console.WriteLine("Press any key to exit");
                Console.ReadKey(true);
                return;
            }
            string fileName = args[0];
            if (!File.Exists(fileName))
            {
                Console.WriteLine($"File not found: {fileName}");
                Console.WriteLine("Press any key to exit");
                Console.ReadKey(true);
                return;
            }

            using (var file = File.OpenRead(fileName))
            {
                //First, find the End of central directory record

                BinaryReader reader = new BinaryReader(file);
                int entryCount = ReadEndOfCentralDirectory(reader);
                if (entryCount > 0)
                {
                    ReadCentralDirectory(reader, entryCount);
                }
            }
            Console.WriteLine("Press any key to exit");
            Console.ReadKey(true);
        }

        private static int ReadEndOfCentralDirectory(BinaryReader reader)
        {
            var b = reader.ReadByte();
            int result = 0;
            long fileSize = reader.BaseStream.Length;
            while (result == 0 && reader.BaseStream.Position < fileSize)
            {
                while (b != 0x50)
                {
                    if (reader.BaseStream.Position < fileSize)
                        b = reader.ReadByte();
                    else
                        break;
                }

                if (reader.BaseStream.Position >= fileSize)
                {
                    break;
                }

                if (reader.ReadByte() == 0x4b && reader.ReadByte() == 0x05 && reader.ReadByte() == 0x06)
                {
                    int diskNumber = reader.ReadInt16();
                    int centralDirectoryStartDiskNumber = reader.ReadInt16();
                    int centralDirectoryCount = reader.ReadInt16();
                    int centralDirectoryTotal = reader.ReadInt16();
                    result = centralDirectoryTotal;
                    int centralDirectorySize = reader.ReadInt32();
                    int centralDirectoryOffset = reader.ReadInt32();
                    int commentLength = reader.ReadInt16();
                    string comment = Encoding.ASCII.GetString(reader.ReadBytes(commentLength));
                    Console.WriteLine("EOCD Found");
                    Console.WriteLine($"Disk Number: {diskNumber}");
                    Console.WriteLine($"Central Directory Disk Number: {centralDirectoryStartDiskNumber}");
                    Console.WriteLine($"Central Directory Count: {centralDirectoryCount}");
                    Console.WriteLine($"Central Directory Total: {centralDirectoryTotal}");
                    Console.WriteLine($"Central Directory Size: {centralDirectorySize}");
                    Console.WriteLine($"Central Directory Offset: {centralDirectoryOffset}");
                    Console.WriteLine($"Comment: {comment}");
                    reader.BaseStream.Seek(centralDirectoryOffset, SeekOrigin.Begin);
                }
            b=0;
            }
            return result;
        }

        private static void ReadCentralDirectory(BinaryReader reader, int count)
        {
            for (int i = 0; i < count; i++)
            {
                var signature = reader.ReadInt32();
                if (signature == 0x02014b50)
                {
                    Console.WriteLine($"Version Made By: {reader.ReadInt16()}");
                    Console.WriteLine($"Minimum version to extract: {reader.ReadInt16()}");
                    Console.WriteLine($"Bit Flag: {reader.ReadInt16()}");
                    Console.WriteLine($"Compression Method: {reader.ReadInt16()}");
                    Console.WriteLine($"File Last Modification Time: {reader.ReadInt16()}");
                    Console.WriteLine($"File Last Modification Date: {reader.ReadInt16()}");
                    Console.WriteLine($"CRC: {reader.ReadInt32()}");
                    Console.WriteLine($"CompressedSize: {reader.ReadInt32()}");
                    Console.WriteLine($"UncompressedSize: {reader.ReadInt32()}");
                    var fileNameLength = reader.ReadInt16();
                    var extraFieldLength = reader.ReadInt16();
                    var fileCommentLength = reader.ReadInt16();
                    Console.WriteLine($"Disk number where file starts: {reader.ReadInt16()}");
                    Console.WriteLine($"Internal file attributes: {reader.ReadInt16()}");
                    Console.WriteLine($"External file attributes: {reader.ReadInt32()}");
                    Console.WriteLine($"Relative offset of local file header: {reader.ReadInt32()}");
                    string filename = Encoding.ASCII.GetString(reader.ReadBytes(fileNameLength));
                    string extraField = Encoding.ASCII.GetString(reader.ReadBytes(extraFieldLength));
                    string fileComment = Encoding.ASCII.GetString(reader.ReadBytes(fileCommentLength));
                    Console.WriteLine($"Filename: {filename}");
                    Console.WriteLine($"Extra Field: {extraField}");
                    Console.WriteLine($"File Comment: {fileComment}");
                }
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接