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;
}
Comment essayez-vous d'ouvrir le fichier? Utilisez-vous le programme d'archivage 7zip ou une autre fonction du LZMA SDK? –
à la fois 7zip et l'utilitaire de dossier zip de Windows. – scottm
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. –