begin process at 2008 05 16 09:07:36
1 173 235 membres
76 nouveaux aujourd'hui
13 970 membres club

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é: 5 385 / 539

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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


Description

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

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

    @+

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS