如何检测和分离连接文件?

时间:2013-12-06 17:58:09

标签: file concatenation cat

我正在尝试找到一种方法来分隔两个使用连接在一起的文件 copy /b file1+file2 file3

我知道两个文件中至少有一个的mime类型和文件类型。

2 个答案:

答案 0 :(得分:1)

使用以下csharp代码,您可以根据zip文件的签名为4 bytes that indicates the local file header的事实进行拆分。如果EXE在某些地方具有相同的4个字节,则此代码将中断。如果你想征服你必须挖掘PE/COFF header to add up all section sizes

不,这对copy a stream byte by byte来说效率不高......

using(var fs = new FileStream(@"exeandzip.screwed", FileMode.Open))
{
    var lfh = new byte[] { 0x50, 0x4b, 0x03, 0x04 }; /* zip local file header signature */
    var match = 0;
    var splitAt = 0;
    var keep = new Queue<int>();
    var b = fs.ReadByte();  
    using(var exe = new FileStream(
                         @"exeandzip.screwed.exe", 
                         FileMode.Create))
    {
        while((b != -1) && (match<lfh.Length))
        {   splitAt++;

            if (b==lfh[match]) 
            {
                match++; 
                keep.Enqueue(b);
            }
            else 
            {
                while(keep.Count>0)
                {
                    exe.WriteByte((byte) keep.Dequeue());
                }
                exe.WriteByte((byte)b);
                match=0;
            }
            b = fs.ReadByte();
        }
    }

    if (match==lfh.Length && b!=-1)
    {
        keep.Enqueue(b);
        splitAt = splitAt-lfh.Length;
        Console.WriteLine(splitAt);
        using(var zip = new FileStream(
                                   @"exeandzip.screwed.zip", 
                                   FileMode.Create))
        { 
            while(keep.Count>0)
            {
                zip.WriteByte((byte) keep.Dequeue());
            }
            b = fs.ReadByte();  
            while(b != -1)
            {  
                zip.WriteByte((byte)b);
                b = fs.ReadByte();
            }
        }
    }   
}

答案 1 :(得分:0)

或者你可以使用 foremost -i <input file> -o <output directory>

我什至用这种方式分割了apple webarchive格式的文件