Maison >développement back-end >Golang >Je souhaite décompresser le fichier .ab sauvegardé par adb et l'écrire dans un package tar

Je souhaite décompresser le fichier .ab sauvegardé par adb et l'écrire dans un package tar

WBOY
WBOYavant
2024-02-10 08:15:171137parcourir

Je souhaite décompresser le fichier .ab sauvegardé par adb et lécrire dans un package tar

L'éditeur PHP Zimo peut vous aider à répondre à la question sur la décompression du fichier .ab sauvegardé par adb et son écriture dans un package tar. La sauvegarde adb est une méthode de sauvegarde dans le système Android et le fichier de sauvegarde généré porte le suffixe .ab. Si vous souhaitez décompresser et écrire une archive tar, vous pouvez le faire en utilisant l'outil ADB et la commande tar. Tout d’abord, utilisez la commande ADB pour convertir le fichier .ab en un package tar, puis utilisez la commande tar pour décompresser le package tar. De cette façon, vous pouvez restaurer le fichier de sauvegarde dans l'archive tar. J'espère que cette réponse vous sera utile !

Contenu de la question

Je vais la gérer comme suit

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()

Une erreur s'est produite : io.copy backup.ab -> échec de backup.ab.tar : eof inattendu

Est-ce que cela se produit parce que le fichier .ab est endommagé ou que la méthode de traitement est incorrecte ?

Solution

Il est très probable que le fichier .ab soit corrompu.

Mais il y a aussi un problème avec votre code. Les 24 premiers octets doivent être ignorés lors de la lecture de fichiers .ab. Sinon, vous devriez voir cette erreur : zlib:无效的标头. Puisque vous voyez autre chose, je vais supposer que votre fichier .ab est corrompu.

D'ailleurs, aucun rd := bufio.newreader(bf) n'est requis.

Voici la démo qui fonctionne pour moi :

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)
    }
}

Mise à jour :

J'ai testé la démo en utilisant backup.ab et aucune erreur n'a été signalée. Mais le fichier tar généré n'est pas valide :

$ tar tvf backup.tar
<...list of files truncated...>
tar: unexpected eof in archive
tar: error is not recoverable: exiting now

J'ai essayé d'utiliser zlib-flate et j'ai obtenu le même résultat :

$ dd if=backup.ab ibs=24 skip=1 | zlib-flate -uncompress > backup2.tar
$ md5sum backup*.tar
3eff01578dec035367688e03b6ec7a72  backup2.tar
3eff01578dec035367688e03b6ec7a72  backup.tar

J'ai essayé https://www.php.cn/link/6e67691b60ed3e4a55935261314dd534 a> et j'ai obtenu le même résultat. Par conséquent backup.ab le fichier devrait être corrompu.

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer