C#解压缩Android备份(adb)文件

时间:2014-08-19 11:40:35

标签: c# android adb archive zlib

我正在尝试使用Deflate算法解压缩Android adb文件。我已经尝试过DotNetZips Ionic Zlib以及Net 4.5中引入的微软内置System.IO.Compression,但它们都会导致存档损坏。它们都具有完全相同的文件大小,但是哈希在腐败和良好的档案之间不匹配。

我正在使用以下代码进行解压缩。

byte[] app = File.ReadAllBytes(tb_keyOutDir.Text + "\\app_stripped.ab");
MemoryStream ms = new MemoryStream(app);

//skip first two bytes to avoid invalid block length error
ms.Seek(2, SeekOrigin.Begin);

DeflateStream deflate = new DeflateStream(ms, CompressionMode.Decompress);
string dec = new StreamReader(deflate, Encoding.ASCII).ReadToEnd();

File.WriteAllText(tb_keyOutDir.Text + "\\app.tar", dec);

我可以通过CygWin使用OpenSSL解压缩它并正确解压缩它以便我知道我的文件没有损坏或任何东西。

cat app_stripped.ab | openssl zlib -d > app.tar

1 个答案:

答案 0 :(得分:2)

使用离子库

尝试使用此方法解压缩:

    public static byte[] Decompress(byte[] gzip) {
        using (var stream = new Ionic.Zlib.ZlibStream(new MemoryStream(gzip), Ionic.Zlib.CompressionMode.Decompress)) {
            const int size = 1024;
            byte[] buffer = new byte[size];
            using (MemoryStream memory = new MemoryStream()) {
                int count = 0;
                do {
                    count = stream.Read(buffer, 0, size);
                    if (count > 0) {
                        memory.Write(buffer, 0, count);
                    }
                }
                while (count > 0);
                return memory.ToArray();
            }
        }
    }

当你想要电话时:

    byte[] app = Decompress(File.ReadAllBytes(tb_keyOutDir.Text + "\\app_stripped.ab"));
    File.WriteAllBytes(tb_keyOutDir.Text + "\\app.tar", app);