MODULE ZLIB - LA COMPRESSION FACILE... (OU DECOMPRESSION)
ciberrique
Messages postés589Date d'inscriptionlundi 25 août 2003StatutMembreDernière intervention18 juillet 2010
-
23 août 2007 à 19:27
vegetalain
Messages postés747Date d'inscriptionmardi 25 mars 2003StatutMembreDernière intervention11 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.
vegetalain
Messages postés747Date d'inscriptionmardi 25 mars 2003StatutMembreDernière intervention11 août 2022 24 févr. 2009 à 14:47
Ca maaaaaaaaaaaaarche ! Merci pour ces réponses miracles :) !
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és747Date d'inscriptionmardi 25 mars 2003StatutMembreDernière intervention11 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és747Date d'inscriptionmardi 25 mars 2003StatutMembreDernière intervention11 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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) :
Il existe egalement la version "VB" de la zlib voir egalement ma source BrowserZip (assez rapide malgres son code en vb).
@+
ciberrique
Messages postés589Date d'inscriptionlundi 25 août 2003StatutMembreDernière intervention18 juillet 20101 23 août 2007 à 21:49
Merci BruNews, maintenant on est fixé ^^.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 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és589Date d'inscriptionlundi 25 août 2003StatutMembreDernière intervention18 juillet 20101 23 août 2007 à 19:34
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és589Date d'inscriptionlundi 25 août 2003StatutMembreDernière intervention18 juillet 20101 23 août 2007 à 19:27
Si c'est en mémoire on peut pas dépasser la taille de la ram ?
24 févr. 2009 à 14:47
24 févr. 2009 à 14:18
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
24 févr. 2009 à 14:14
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
24 févr. 2009 à 14:01
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
24 févr. 2009 à 13:41
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??
24 août 2007 à 15:53
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
@+
24 août 2007 à 04:38
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...
23 août 2007 à 22:36
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).
@+
23 août 2007 à 21:49
23 août 2007 à 21:46
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.
23 août 2007 à 20:56
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 ?
++
23 août 2007 à 19:34
23 août 2007 à 19:33
23 août 2007 à 19:27