2009-12-09 5 views
2

J'essaie d'utiliser le LZMA SDK pour créer une archive zip (format .zip ou .7z). J'ai téléchargé et construit le SDK et je veux juste utiliser les exportations dll pour compresser ou décompresser quelques fichiers. Lorsque j'utilise la méthode LzamCompress, il renvoie 0 (SZ_OK) comme s'il fonctionnait correctement. Cependant, après avoir écrit le tampon dans le fichier et essayé de l'ouvrir, j'obtiens une erreur que le fichier ne peut pas être ouvert en tant qu'archive.Pouvez-vous aider à créer une archive zip avec le SDK LZMA (7zip)?

Voici le code que j'utilise actuellement. Toute suggestion serait appréciée.

#include "lzmalib.h" 

typedef unsigned char byte; 

using namespace std; 

int main() 
{ 
    int length = 0; 
    char *inBuffer; 

    byte *outBuffer = 0; 
    size_t outSize; 
    size_t outPropsSize = 5; 
    byte * outProps = new byte[outPropsSize]; 

    fstream in; 
    fstream out; 

    in.open("c:\\temp\\test.exe", ios::in | ios::binary); 

    in.seekg(0, ios::end); 
    length = in.tellg(); 
    in.seekg(0, ios::beg); 

    inBuffer = new char[length]; 

    outSize = (size_t) length/20 * 21 + (1 << 16); //allocate 105% of file size for destination buffer 

    if(outSize != 0) 
    { 
     outBuffer = (byte*)malloc((size_t)outSize); 
     if(outBuffer == 0) 
     { 
      cout << "can't allocate output buffer" << endl; 
      exit(1); 
     } 
    } 

    in.read(inBuffer, length); 
    in.close(); 

    int ret = LzmaCompress(
     outBuffer, /* output buffer */ 
     &outSize, /* output buffer size */ 
     reinterpret_cast<byte*>(inBuffer),/* input buffer */ 
     length, /* input buffer size */ 
     outProps, /* archive properties out buffer */ 
     &outPropsSize,/* archive properties out buffer size */ 
     5, /* compression level, 5 is default */ 
     1<<24,/* dictionary size, 16MB is default */ 
     -1, -1, -1, -1, -1/* -1 means use default options for remaining arguments */ 
    ); 

    if(ret != SZ_OK) 
    { 
     cout << "There was an error creating the archive." << endl; 
     exit(1); 
    } 

    out.open("test.zip", ios::out | ios::binary); 

    out.write(reinterpret_cast<char*>(outBuffer), (int)(outSize)); 
    out.close(); 

    delete inBuffer; 
    delete outBuffer; 
} 
+0

Comment essayez-vous d'ouvrir le fichier? Utilisez-vous le programme d'archivage 7zip ou une autre fonction du LZMA SDK? –

+0

à la fois 7zip et l'utilitaire de dossier zip de Windows. – scottm

+0

J'essaie aussi de le faire mais toujours pas réussi. quelques points à noter. 1) les 5 premiers octets seront les propriétés de l'en-tête (outProps) et les 8 octets suivants sont la longueur. 2) Puis vient les données compressées. Quand j'écris de cette manière aussi, ça échoue. Je pense que nous devons ajouter '7', 'z' aussi. je ne suis pas sûr. –

Répondre

1

Je ne sais pas LZMA spécifiquement, mais de ce que je sais de la compression en général, il semble que vous écrivez un train de bits compressé dans un fichier sans informations d'en-tête qui permettrait un programme de décompression savent comment le flux de bits est compressé.

La fonction LzmaCompress() écrit probablement cette information dans outProps. Il devrait y avoir une autre fonction dans le SDK qui prendra le flux binaire compressé dans outBuffer et les propriétés dans outProps et créer une archive appropriée à partir d'eux.

+1

C'est un peu ce à quoi je pense, mais la DLL n'exporte que LzmaCompress et LzmaDecompress – scottm

+0

Si vous pouviez le décompresser avec LzmaDecompress, cela résoudrait-il votre problème ou avez-vous pour générer une archive compatible avec 7zip? –

+0

Je suppose que la décompression avec LzmaDecompress serait bien, mais quand j'essaye ça, la taille de sortie reste 0, même si la fonction retourne SZ_OK – scottm

Questions connexes