COMPRESSION / DECOMPRESSION A PARTIR DU SDK LZMA DE 7ZIP ( MULTI FICHIER )

Messages postés
7
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
15 octobre 2007
- - Dernière réponse : cs_Roulito
Messages postés
1
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
4 mai 2008
- 4 mai 2008 à 15:15
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43866-compression-decompression-a-partir-du-sdk-lzma-de-7zip-multi-fichier

cs_Roulito
Messages postés
1
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
4 mai 2008
-
Bonjour.

J'ai repris dans VS 2005 ton projet.
La compilation se passe normalement.
J'ai tenté de créer une archive (avec le projet de demo) et même s'il n'y a pas d'erreur, le logiciel 7-Zip ne peut pas lire cette archive. Est-ce normal ?
Comment peut-on corriger cela ?
Seul le programme que tu as fait permet de relire correctement cette archive.

Roulito
JossGP
Messages postés
7
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
15 octobre 2007
-
Hi, Vince_02

Thank you for answer.

I want to inform you about another change i made.
private UInt32 ReadLeUInt32()
{
uint Number;
uint item;
Number = ReadLeByte();
for (int i = 1; i < 4; i++)
{
item = ReadLeByte();
Number = (item << 8*i ) | Number ;
}
return Number;
}
This was necessary to read correctly a UINT number without truncation.
After that all take place in the right way.

I found very interesting your idea to add an error journal ,because it can help us to check if everything is went ok. Please inform me when you have news bout it.

Giorgio
JossGP
Messages postés
7
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
15 octobre 2007
-
Hi, Vince_02

Thank you for answer.

I want to inform you about another change i made.
private UInt32 ReadLeUInt32()
{
uint Number;
uint item;
Number = ReadLeByte();
for (int i = 1; i < 4; i++)
{
item = ReadLeByte();
Number = (item << 8*i ) | Number ;
}
return Number;
}
This was necessary to read correctly a UINT number without truncation.
After that all take place in the right way.

I found very interesting your idea to add an error journal ,because it can help us to check if everything is went ok. Please inform me when you have news bout it.

Giorgio
Vince_02
Messages postés
33
Date d'inscription
dimanche 15 mai 2005
Statut
Membre
Dernière intervention
14 janvier 2016
1 -
OK, je suis comme toi, je sais lire l'anglais, mais l'écrire, c'est une autre histoire ...

Pour l'erreur "OutOfRangeMemory" je pense que c'est du à la class "SevenZip", le taux de compression doit être trop élevé, enfin c'est une supposition et non une certitude.
(Plus le taux est élevé, plus cela prend de mémoire.)

Pour les 2 solutions que tu m'as apporté, je ne comprends pas pourquoi cela ne fonctionne pas pour toi, personnellement je n'ai jamais eu de problème sur ces 2 fonctions. Mais bon, j'en tiens compte pour la prochaine mise à jour.

Sur la prochaine Mise à jour, j'ai ajouté pas mal de fonction utils comme créé un SFX, un système de "Journal d'erreur" et quelque correction, ceux que tu as apporté seront inclus.
par contre je ne saurais te dire quand, actuellement j'ai moin de temps a consacré a tout ça ...
JossGP
Messages postés
7
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
15 octobre 2007
-
Hi, after several hours , it seems I have found some problems. I want to post here if someone has the same problems I had.

1. in some circumstances this function crash.
private void WriteLeInt16(Int16 value)
{
//archiveStream.WriteByte((byte)(value); --->>> crash
archiveStream.WriteByte((byte)(value & 0xFF)); --->>> Ok!
archiveStream.WriteByte((byte)(value >> 8));
}
2. When you calculate the CRC and call this function:

private void WriteCompressedSizeAndCrc(long compressedSize, uint crc32)

I don't do ...
//WriteLeInt32((Int32)crc32); -->> this truncate the value with wrong value
I create a new function
WriteLeUInt32(crc32);
private void WriteLeUInt32(uint value)
{
uint ch;
for (int i = 0; i < 4; i++) {
ch = value >> (8 * i) ;
archiveStream.WriteByte((byte)(ch & 0xFF));
}
}
after these little modification the class is starting to take place and I see some results. Now I go on , if I found something else I post here for other people.

Thank.
Giorgio