begin process at 2012 02 17 06:09:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Modules

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :10 851 / 832

Auteur : Renfield

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ...
Source avec Zip Source avec une capture JSON PARSER - ANALYSE DE CHAINES JSON
Source avec Zip Source avec une capture MODULE DE TÉLÉCHARGEMENT DE FICHIER BASIQUE (SYNCHRONE / ASY...
Source avec Zip COURS DE PILOTAGE........D'APPLICATIONS
Source avec Zip CSOCKET - REMPLACEZ WINSOCK PAR LA VERSION 2 DES API

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) CRYPTAGE ET DECRYPTAGE par jerichez
Source avec Zip Source avec une capture Source .NET (Dotnet) EXEMPLE MODBUS POUR MODULES ADAM, BECKHOFF, WAGO par mnmsjaune
Source avec Zip Source .NET (Dotnet) CRÉER SON PROPRE DESIGNER COMME CELUI DE VISUAL STUDIO par ShareVB
Source avec Zip Source .NET (Dotnet) CONVERSION UTM VERS LAT/LONG par BarresLTD
Source avec Zip CPROPGROUP : COLLECTION FAITE MAISON par Flocreate

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) VBZIP GESTION D'ARCHIVES AU FORMAT ZIP UTILISANT IONIC.UTIL... par gillardg
Source avec Zip Source .NET (Dotnet) ZLIB.NET : COMPRESSION ZIP AVEC VB.NET par bouv
Source avec Zip Source .NET (Dotnet) NET-2 COMPRESSION DE FICHIER EN ZIP AVEC L'AIDE DE VJ# ET EN... par cmarcotte
Source avec Zip Source .NET (Dotnet) [.NET2] COMPRESSION/DÉCOMPRESSION GZIP DE FICHIER GRÂCE À IO... par hvb
ZIPPER UN FICHIER EN UTILISANT LA FONCTION DE COMPRESSION IN... par cavo789

Commentaires et avis

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 ?

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

Commentaire de ciberrique le 23/08/2007 19:34:57

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

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 ?

++

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.

Commentaire de ciberrique le 23/08/2007 21:49:34

Merci BruNews, maintenant on est fixé ^^.

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

@+

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

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

@+

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

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

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

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

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 Besoin d'aide :/ macro de zip/compression [ par sabrina75017 ] Bonjour à Tous, Je suis bloquée sur le code d'une macro et là, je déclare forfait de mon côté, j'ai vraiment besoin de votre aide. La situation : Dézipper fichiers .zip [ par Blodarn ] Bonjour à tous, Je suis en train de coder un launcher Minecraft pour mon serveur. Celui-ci doit donc télécharger des fichiers mis en ligne avec dropb Compression dossiers [ par Sentynel ] Bonjour, cela fait un certain temps que je cherche a pouvoir compresser/decompresser des dossier. Je voudrai pouvoir compresser un dossier contenant [CS]Erreur dans la page [ par lexsty ] Bonjour " Il y a eu une erreur dans la page " c'est le message que je reçois quand veux modifier une de mes sources du sîte CodeS-SourceS j'ai respect Excel - Compression d'images [ par djcoach ] Bonjour à tous, par vba, j'insère une image, la redimentionne et la positionne. Puis je la compresse à la définition "Site web/écran" : ' _________


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,279 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales