登录
首页 >  Golang >  Go问答

如下的标题也表达了同样的意思:将.ab文件解压并写入tar包

来源:stackoverflow

时间:2024-02-07 21:48:23 344浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《如下的标题也表达了同样的意思:将.ab文件解压并写入tar包》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我按照以下方式处理

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 失败:意外的 eof

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


正确答案


很可能是 .ab 文件已损坏。

但是您的代码也存在问题。从 .ab 文件读取时应跳过前 24 个字节。否则,您应该看到此错误:zlib:无效的标头。由于您看到其他内容,我会假设您的 .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测试了演示,没有错误报道称。但生成的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

尝试过https://github.com/nelenkov/android-backup-extractor a>,也得到了相同的结果。因此 backup.ab 文件应该已损坏。

$ java -jar ~/Downloads/abe.jar unpack backup.ab backup3.tar
$ md5sum backup*.tar
3eff01578dec035367688e03b6ec7a72  backup2.tar
3eff01578dec035367688e03b6ec7a72  backup3.tar
3eff01578dec035367688e03b6ec7a72  backup.tar

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如下的标题也表达了同样的意思:将.ab文件解压并写入tar包》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>