MODULE ZLIB - LA COMPRESSION FACILE... (OU DECOMPRESSION)

ciberrique Messages postés 589 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 18 juillet 2010 - 23 août 2007 à 19:27
vegetalain Messages postés 747 Date d'inscription mardi 25 mars 2003 Statut Membre Dernière intervention 11 août 2022 - 24 févr. 2009 à 14:47
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/43871-module-zlib-la-compression-facile-ou-decompression

vegetalain Messages postés 747 Date d'inscription mardi 25 mars 2003 Statut Membre Dernière intervention 11 août 2022
24 févr. 2009 à 14:47
Ca maaaaaaaaaaaaarche ! Merci pour ces réponses miracles :) !
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 févr. 2009 à 14:18
ben vi ^^
il repart pas du contenu de la texbox... mais du tableau obtenu en compressant la donnée en entrée.

si tu branche la décompression su r ce qu'affiche CcTxtComp, je pense que tu vas pas obtenir le bon résultat en sortie (caractères invalides, supprimés ?)

suffit de faire :

Private Sub Command2_Click()
If LenB(CcTxtComp.Text) Then
mxbBufferIn = StrConv(CcTxtComp.Text, vbFromUnicode)
UncompressData mxbBufferIn, mxbBufferOut
CcTxtVerif.Text = StrConv(mxbBufferOut, vbUnicode)
Else
CcTxtVerif.Text = vbNullString
End If
If CcTxtVerif.Text <> CcTxtUncomp.Text Then
MsgBox "Erreur, le flux décompressé est différent du flux d'entrée.", vbExclamation
End If
End Sub
vegetalain Messages postés 747 Date d'inscription mardi 25 mars 2003 Statut Membre Dernière intervention 11 août 2022
24 févr. 2009 à 14:14
merci de cette réponse super rapide, le code ressemble à ça là :

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Dim mxbBufferIn() As Byte
Dim mxbBufferOut() As Byte
Private Sub CcTxtComp_Change()
CcLblComp.Caption = "Longueur : " & Len(CcTxtComp.Text)
End Sub

Private Sub CcTxtVerif_Change()
CcLblVerif.Caption = "Longueur : " & Len(CcTxtVerif.Text)
End Sub

Private Sub Command1_Click()
CcLblUncomp.Caption = "Longueur : " & Len(CcTxtUncomp.Text)
If LenB(CcTxtUncomp.Text) Then
mxbBufferIn = StrConv(CcTxtUncomp.Text, vbFromUnicode)
CompressData mxbBufferIn, mxbBufferOut
CcTxtComp.Text = StrConv(mxbBufferOut, vbUnicode)
Else
CcTxtComp.Text = vbNullString
End If
End Sub

euh... lorsque je copie colle le résultat compressé, que je stope l'appli et que je la relance et que je colle le résultat compressé, il décompresse rien, c normal?

Private Sub Command2_Click()
If LenB(CcTxtComp.Text) Then
mxbBufferIn = mxbBufferOut
UncompressData mxbBufferIn, mxbBufferOut
CcTxtVerif.Text = StrConv(mxbBufferOut, vbUnicode)
Else
CcTxtVerif.Text = vbNullString
End If
' If CcTxtVerif.Text <> CcTxtUncomp.Text Then
' MsgBox "Erreur, le flux décompressé est différent du flux d'entrée.", vbExclamation
' End If
End Sub
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 févr. 2009 à 14:01
dans Command2_Click
tu as xbBufferIn = xbBufferOut

mais là, ca ne va pas, tu parles de TON tableau xbBufferOut, déclaré deux lignes plus haut.

tu peux tenter:

Private mxbBufferIn() As Byte
Private mxbBufferOut() As Byte

Private Sub Command1_Click()
CcLblUncomp.Caption = "Longueur : " & Len(CcTxtUncomp.Text)
If LenB(CcTxtUncomp.Text) Then
mxbBufferIn = StrConv(CcTxtUncomp.Text, vbFromUnicode)
CompressData mxbBufferIn, mxbBufferOut
CcTxtComp.Text = StrConv(mxbBufferOut, vbUnicode)
Else
CcTxtComp.Text = vbNullString
End If
End Sub

Private Sub Command2_Click()
If LenB(CcTxtComp.Text) Then
mxbBufferIn = mxbBufferOut
UncompressData mxbBufferIn, mxbBufferOut
CcTxtVerif.Text = StrConv(mxbBufferOut, vbUnicode)
Else
CcTxtVerif.Text = vbNullString
End If
If CcTxtVerif.Text <> CcTxtUncomp.Text Then
MsgBox "Erreur, le flux décompressé est différent du flux d'entrée.", vbExclamation
End If
End Sub
vegetalain Messages postés 747 Date d'inscription mardi 25 mars 2003 Statut Membre Dernière intervention 11 août 2022
24 févr. 2009 à 13:41
j'ai essayé de répartir le code dans deux boutons, ça ne fonctionne pas :/

Private Sub Command1_Click()
Dim xbBufferIn() As Byte
Dim xbBufferOut() As Byte
CcLblUncomp.Caption = "Longueur : " & Len(CcTxtUncomp.Text)

If LenB(CcTxtUncomp.Text) Then
xbBufferIn = StrConv(CcTxtUncomp.Text, vbFromUnicode)
CompressData xbBufferIn, xbBufferOut
CcTxtComp.Text = StrConv(xbBufferOut, vbUnicode)
Else
CcTxtComp.Text = vbNullString
End If
End Sub

Private Sub Command2_Click()
Dim xbBufferIn() As Byte
Dim xbBufferOut() As Byte
If LenB(CcTxtComp.Text) Then
xbBufferIn = xbBufferOut
UncompressData xbBufferIn, xbBufferOut
CcTxtVerif.Text = StrConv(xbBufferOut, vbUnicode)
Else
CcTxtVerif.Text = vbNullString
End If
If CcTxtVerif.Text <> CcTxtUncomp.Text Then MsgBox "Erreur, le flux décompressé est différent du flux d'entrée.", vbExclamation
End Sub

Où ça coince??
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
24 août 2007 à 15:53
Selon toute logique le programmeur DOIT connaitre la taille à decompressé ! Il faut lire l'information dans l'entete du fichier zip ou dans le stream. Le redim preserve est une operation hyper longue compte tenu que vb fait une copie de toute les données deja presente si la realoc echou et donc le varptr du debut n'est plus le varptr de l'apres redim etc...

C'est peut être un raisonnement naif mais bon InputSize/OutputSize c'est quand même la base de la compression (surtout qu'avec la methode inflate/deflate le InputSize peut être superieur à l'OutputSize) :p

@+
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 août 2007 à 04:38
code mis a jour.

EB> un seul appel, oui... quand on peut prévoir la taille du buffer de sortie (enfin, une taille suffisante)
- Pour compresser, pas de soucis, la taille du buffer de sortie est en gros équivalente a la taille du buffer d'entrée. meme en ne compressant pas, on aurait assez de place ^^

- Pour décompresser, faut connaitre la taille des données décompressées. On ne le sais pas toujours... J'ai donc ajouté un parametre optionnel pour la décompression, pour que l'on puisse spécifier ce qui sera finalement la taille du buffer de sortie (qui sera agrandie si nécessaire).

Mortalino> C'est variable, mais c'est ZLib qui gère, et ca compresse pas mal...
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
23 août 2007 à 22:36
A quoi sert tout ce code ? Un seul appel a Inflate/Deflate suffit (voir mes source sur zlib genre BrowserZip) :

inflateInit2 mStrm, -MAX_WBITS, ZLIB_VERSION, Len(mStrm)
inflate mStrm, Z_FINISH
inflateEnd mStrm

Il existe egalement la version "VB" de la zlib voir egalement ma source BrowserZip (assez rapide malgres son code en vb).

@+
ciberrique Messages postés 589 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 18 juillet 2010 1
23 août 2007 à 21:49
Merci BruNews, maintenant on est fixé ^^.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 août 2007 à 21:46
La taille maxi d'allocation mémoire que peut effectuer un prog est de 2 Go, un processus ne pouvant occuper plus de 4 Go et les 2 autres de l'espace mémoire de ce processus sont réservés à la zone kernel.
La limitation à 4 Go est simplement due à la taille du registre processeur:
32 bits donc 2^32 = 4 Go, c'est donc le plus loin qu'un pointeur puisse indiquer comme adresse.
On évacue l'étude du mode x64, VB n'a pas de portage.
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 août 2007 à 20:56
"Si c'est en mémoire on peut pas dépasser la taille de la ram ?"

me semble que la mémoire du fichier d'échange situé sur le disque dur prend le relai une fois le mémoire vive pleine^^

Renfield, pas testé (enfin, pas encore) mais rapport compression, en %, tu gagnes combien ?

++
ciberrique Messages postés 589 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 18 juillet 2010 1
23 août 2007 à 19:34
C'etait une question, pas une affirmation ^^.
Utilisateur anonyme
23 août 2007 à 19:33
Une bonne source, mais la remarque de cyberrique est très interessente, ce qui limite ton programme, c'est pour cela que j'attribue un 7/10 à ta source ;)
ciberrique Messages postés 589 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 18 juillet 2010 1
23 août 2007 à 19:27
Si c'est en mémoire on peut pas dépasser la taille de la ram ?
Rejoignez-nous