我想解压adb备份的.ab文件写入tar包

问题描述 投票:0回答:1

我按以下方式处理

bf, err := os.Open(backupFilePath)
if err != nil {
    fmt.Println("os.Open: ", err)
    return
}
defer bf.Close()
rd := bufio.NewReader(bf)

tarFile, err := os.Create(tarFilePath)
if err != nil {
    fmt.Println("os.Create: ", err)
    return
}
defer tarFile.Close()

zf, zerr := zlib.NewReader(rd)
if zerr != nil {
    return "", zerr
}
_, err = io.Copy(tarFile, zf)
if err != nil {
    fmt.Println("io.Copy backup.ab -> backup.ab.tar failed:  ", err)
}
zf.Close()

发生错误:io.Copy backup.ab -> backup.ab.tar failed: Unexpected EOF

出现这种情况是因为 .ab 文件已损坏还是处理方式错误?

go adb tar
1个回答
0
投票

很有可能是.ab文件损坏了

但是你的代码也有问题。从 .ab 文件读取时,您应该跳过前 24 个字节。否则,您应该会看到此错误:

zlib: invalid header
。由于您看到了其他内容,我认为您的 .ab 文件已损坏。

顺便说一句,不需要

rd := bufio.NewReader(bf)

这是适合我的演示:

package main

import (
    "compress/zlib"
    "io"
    "os"
)

func main() {
    bf, err := os.Open("temp.ab")
    if err != nil {
        panic(err)
    }
    defer bf.Close()
    if _, err := bf.Seek(24, 0); err != nil {
        panic(err)
    }

    zf, err := zlib.NewReader(bf)
    if err != nil {
        panic(err)
    }
    defer zf.Close()

    tarFile, err := os.Create("temp.tar")
    if err != nil {
        panic(err)
    }
    defer tarFile.Close()

    _, err = io.Copy(tarFile, zf)
    if err != nil {
        panic(err)
    }
}

更新

backup.ab测试了demo,没有报错。但是生成的tar文件无效:

$ tar tvf backup.tar
<...list of files truncated...>
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now

zlib-flate
试过,得到相同的结果:

$ dd if=backup.ab ibs=24 skip=1 | zlib-flate -uncompress > backup2.tar
$ md5sum backup*.tar
3eff01578dec035367688e03b6ec7a72  backup2.tar
3eff01578dec035367688e03b6ec7a72  backup.tar
© www.soinside.com 2019 - 2024. All rights reserved.