Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

Catégorie :Modules Classé sous : zlib, inflate, deflate, compression, zip Niveau : Débutant Date de création : 23/08/2007 Date de mise à jour : 24/08/2007 04:31:50 Vu / téléchargé: 8 166 / 680

Note :
9 / 10 - par 3 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Je sais que de telles sources existent déjà sur le site, mais là, ca gère tout en mémoire, sans créer de fichier temporaire.

Ce module permet de compresser/décompresser très facilement vos données depuis et vers des tableaux d'octets.
 

Source

  • Public Function CompressData(ByRef vxbInput() As Byte, ByRef vxbOutput() As Byte, Optional vnStart As Long = 0, Optional vnMaxSize As Long = 0, Optional veCompressionLevel As ZLIB_CompressionLevelConstants = Z_DEFAULT_COMPRESSION) As Boolean
  • Dim tStream As zStream
  • Dim rc As Long
  • Dim xbCopy() As Byte
  • With tStream
  • '# On initialise les parametres de la structure stream
  • If deflateInit(tStream, veCompressionLevel, ZLIB_Version, Len(tStream)) = 0 Then
  • CompressData = True
  • '# Les données sont a prendre dans le tableau en entrée
  • CopyMemory rc, ByVal ArrPtr(vxbInput), 4
  • If rc Then
  • CopyMemory .avail_in, ByVal rc + 16, 4
  • .avail_in = .avail_in - vnStart
  • End If
  • If .avail_in > 0 And vnStart < .avail_in Then
  • '# Doit-on prendre tout le tableau ?
  • If vnMaxSize <> 0 And vnMaxSize < .avail_in Then
  • .avail_in = vnMaxSize
  • End If
  • .next_in = VarPtr(vxbInput(vnStart))
  • '# On regarde ou sont les données du tableau de sortie.
  • '# Pas de VarPtr ici car ce tableau peut etre vide, ca évite un On Error ^^
  • CopyMemory rc, ByVal ArrPtr(vxbOutput), 4
  • If rc Then
  • CopyMemory rc, ByVal rc + 12, 4
  • If rc + vnStart = .next_in Then
  • '# Le tableau d'entrée et le tableau de sortie pointent au même endroit...
  • '# ca ne va "pas le faire" ...
  • xbCopy = vxbInput
  • .next_in = VarPtr(xbCopy(vnStart))
  • ElseIf vnStart Then
  • '# On recopie le début du tableau
  • ReDim vxbOutput(vnStart - 1)
  • CopyMemory vxbOutput(0), vxbInput(0), vnStart - 1
  • End If
  • Else
  • vxbOutput = vxbInput
  • End If
  • .avail_out = .avail_in + 12
  • '# On agrandit le tableau de sortie
  • ReDim Preserve vxbOutput(.total_out - 1 + .avail_out + vnStart)
  • '# Les nouvelles données décompressées seront placées à la suite, dans le tableau...
  • .next_out = VarPtr(vxbOutput(vnStart + .total_out))
  • '# Lance la décompression a proprement parler
  • CompressData = deflate(tStream, 4) = 1
  • If .total_out Or vnStart Then
  • ReDim Preserve vxbOutput(.total_out + vnStart - 1)
  • Else
  • Erase vxbOutput
  • End If
  • End If
  • '# Fin de l'utilisation de ZLib
  • deflateEnd tStream
  • End If
  • End With
  • End Function
Public Function CompressData(ByRef vxbInput() As Byte, ByRef vxbOutput() As Byte, Optional vnStart As Long = 0, Optional vnMaxSize As Long = 0, Optional veCompressionLevel As ZLIB_CompressionLevelConstants = Z_DEFAULT_COMPRESSION) As Boolean
Dim tStream As zStream
Dim rc As Long
Dim xbCopy() As Byte
    With tStream
        '# On initialise les parametres de la structure stream
        If deflateInit(tStream, veCompressionLevel, ZLIB_Version, Len(tStream)) = 0 Then
            CompressData = True
            '# Les données sont a prendre dans le tableau en entrée
            CopyMemory rc, ByVal ArrPtr(vxbInput), 4
            If rc Then
                CopyMemory .avail_in, ByVal rc + 16, 4
                .avail_in = .avail_in - vnStart
            End If
            If .avail_in > 0 And vnStart < .avail_in Then
                '# Doit-on prendre tout le tableau ?
                If vnMaxSize <> 0 And vnMaxSize < .avail_in Then
                    .avail_in = vnMaxSize
                End If
                .next_in = VarPtr(vxbInput(vnStart))
                                
                '# On regarde ou sont les données du tableau de sortie.
                '# Pas de VarPtr ici car ce tableau peut etre vide, ca évite un On Error ^^
                CopyMemory rc, ByVal ArrPtr(vxbOutput), 4
                If rc Then
                    CopyMemory rc, ByVal rc + 12, 4

                    If rc + vnStart = .next_in Then
                        '# Le tableau d'entrée et le tableau de sortie pointent au même endroit...
                        '# ca ne va "pas le faire" ...
                        xbCopy = vxbInput
                        .next_in = VarPtr(xbCopy(vnStart))
                    ElseIf vnStart Then
                        '# On recopie le début du tableau
                        ReDim vxbOutput(vnStart - 1)
                        CopyMemory vxbOutput(0), vxbInput(0), vnStart - 1
                    End If
                Else
                    vxbOutput = vxbInput
                End If
                
                .avail_out = .avail_in + 12
                 '# On agrandit le tableau de sortie
                 ReDim Preserve vxbOutput(.total_out - 1 + .avail_out + vnStart)
                 '# Les nouvelles données décompressées seront placées à la suite, dans le tableau...
                 .next_out = VarPtr(vxbOutput(vnStart + .total_out))
                
                 '# Lance la décompression a proprement parler
                 CompressData = deflate(tStream, 4) = 1
                
                If .total_out Or vnStart Then
                    ReDim Preserve vxbOutput(.total_out + vnStart - 1)
                Else
                    Erase vxbOutput
                End If
            End If
            
            '# Fin de l'utilisation de ZLib
            deflateEnd tStream
        End If
    End With
End Function

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

24 août 2007 04:16:40 :
les donnes seront normallement traitées plus vite.
24 août 2007 04:31:50 :
erreur avec le fichier Zip

Commentaires et avis

signaler à un administrateur
Commentaire de ciberrique le 23/08/2007 19:27:42

Si c'est en mémoire on peut pas dépasser la taille de la ram ?

signaler à un administrateur
Commentaire de MALIKcpp le 23/08/2007 19:33:15

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 ;)

signaler à un administrateur
Commentaire de ciberrique le 23/08/2007 19:34:57

C'etait une question, pas une affirmation ^^.

signaler à un administrateur
Commentaire de mortalino le 23/08/2007 20:56:43

"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 ?

++

signaler à un administrateur
Commentaire de BruNews le 23/08/2007 21:46:53 administrateur CS

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.

signaler à un administrateur
Commentaire de ciberrique le 23/08/2007 21:49:34

Merci BruNews, maintenant on est fixé ^^.

signaler à un administrateur
Commentaire de EBArtSoft le 23/08/2007 22:36:49 administrateur CS

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).

@+

signaler à un administrateur
Commentaire de Renfield le 24/08/2007 04:38:58 administrateur CS

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...

signaler à un administrateur
Commentaire de EBArtSoft le 24/08/2007 15:53:24 administrateur CS

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

@+

signaler à un administrateur
Commentaire de vegetalain le 24/02/2009 13:41:21

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??

signaler à un administrateur
Commentaire de Renfield le 24/02/2009 14:01:39 administrateur CS

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

signaler à un administrateur
Commentaire de vegetalain le 24/02/2009 14:14:44

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

signaler à un administrateur
Commentaire de Renfield le 24/02/2009 14:18:42 administrateur CS

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

signaler à un administrateur
Commentaire de vegetalain le 24/02/2009 14:47:31

Ca maaaaaaaaaaaaarche ! Merci pour ces réponses miracles :) !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Compression [ par eldim ] Bonjour,Est-ce quelqu'un connait un programme zip qui v&#233;rifie si un fichier existe d&#233;ja dans un zip et compare les versions avant d'ajouter Algorithme de compression (ZIP RAR ACE....) [ par Fildomen ] Salutje veux me lancer dans un prog de compression, masi je ne trouve pas de doc, s'il vous plait passez moi un lien sur les algorihmes de n'importe e Compression / décompression [ par nicolasheurtevin ] Bonjour, J'ai quelques petits soucis apr&#232;s avoir essay&#233; diff&#233;rents bouts de code permettant la compression zip et la d&#233;compressi Problème Compression zip [ par Taurus67 ] Bonjour, je fait un petit logiciel qui doit compresser en zip des demos (.dem) ( counter strike ) une fois que celle ci ont fini d'&#234;tre enregistr Compression ZIP VB.NET 2003 [ par eldim ] Bonjour,Je dispose de la class "ICSharpCode.SharpZipLib.Zip" pour compresser mes fichier en VB.NET.Y a-t-il un moyen de v&#233;rifier si un fichier ex VBA Excel - Recherche de fichiers [ par econs ] Bonjour &#224; toutes et tous. Je poss&#232;de un dossier contenant un certain nombre de fichiers : -&nbsp;&nbsp; Un fichier Visio&nbsp;&nbsp;&nbs Compression/Decompression avec crc en VB.net [ par serey ] Bonjour,je souhaiterai compresser et decompresser des fichiers en vb et cela avec un crc pour v&#233;rifier l'integrit&#233; de mes fichiers. Comment problème de zip [ par pseudoOM ] Salut &#224; tous j'ai un tr&#232;s gros probl&#232;me.Dans mon programme je clique sur un bouton et je zip un fichier avec une fonction que j'ai trou Vraiment débutant [ par ptilou54 ] BonjourVoila je recherchais sur le net un simulateur de PID et je l'ai trouver sur ce site alors j'ai t&#233;l&#233;charger le fichier zip mais je ne Application.FileSearch d'un fichier .zip [ par CerberusPau ] A priori &#231;a a l'air correct ... C'est vrai pour un fichier avec une extension .doc, .bak, .old par exemple...Mais &#231;a ne marche pas avec une


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,515 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.