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 !

COMPRESSION/DÉCOMPRESSION PAR FENÊTRAGE


Information sur la source

Description

Test réalisé sur Cyrix II 300 64Mo Ram.
Vitesse compression: 2Ko/s env
Vitesse décompression: 3Ko/s env
Vitesse variable selon fichiers
Taux de compression: faible (50 % max selon redondances de motifs)

Module VB5 j'espère assez documenté. Théoriquement applicable pour VB3,4,5,6 (pas de forms ni de fonctions spécifiques).


' Module développé par Philippe LARASSE le 03.07.2000

Option Explicit
Dim nx As Long, xx As String, nn As Long, fich0 As String, fich1 As String, msg As String
Dim hr1 As Variant, hr2 As Variant
Sub Main()
  Dim lchoix As String
  msg = ""
  Do
    If MsgBox("OUI = Compression , NON = Décompression", vbYesNo, "Essai Comp/Dcomp") = vbYes Then
      lchoix = "Compresser"
    Else
      lchoix = "Décompresser"
    End If
    fich0 = InputBox$(lchoix & " quel fichier ?" & Chr(13) & "(Chemin + nom)", lchoix, fich0)
    If fich0 = "" Then
      Exit Do
    Else
      fich1 = InputBox$(lchoix & " le fichier: " & Chr(13) & fich0 & Chr(13) & "Vers quel fichier ?" & Chr(13) & "(Chemin + nom)", lchoix, fich1)
      If fich1 = "" Then
        Exit Do
      Else
        If lchoix = "Compresser" Then
          Call compresser1
        Else
          Call decompresser1
        End If
        MsgBox msg, vbOKOnly, "Résultat"
        If MsgBox("Continuer ?", vbYesNo, "COMP/DECOMP") = vbNo Then
          Exit Do
        End If
      End If
    End If
  Loop
  End
End Sub
Sub compresser1()
  hr1 = Time
  Dim code As String, ctrl As String, buff As String
  Dim pnt As Long, enr As String, cur As Integer, lcur As Integer
  Dim mot As String, trouve As Integer, limit As Long
  Dim lcode As Long, atrouve As Integer, alcur As Integer, amot As String
  Close
  Open fich1 For Binary As #1
  Close
  Kill fich1
  Open fich0 For Binary As #1
  Open fich1 For Binary As #2
  ' lecture par blocs de 16382 octets
  ' buffer : fenêtre du buffer
  buff = String(16382, " ")
  Get #1, 1, buff
  Put #2, 1, buff
  ' les 16382 premiers octets ne sont pas compressés
  ' puisqu'on va chercher dans la chaîne le mot à coder
  pnt = 16382
  ' pointeur de lecture
  Do While pnt < LOF(1)
    If pnt + 16382 > LOF(1) Then
      enr = String(LOF(1) - pnt, " ")
      ' s'il ne reste pas 16382 octets, lire ce qui reste
    Else
      ' sinon lire 16382 octets
      enr = String(16382, " ")
    End If
    Get #1, , enr
    pnt = pnt + Len(enr)
    ' enr : chaîne à coder
    cur = 1: lcur = 1: mot = ""
    ' cur: position courante
    ' lcur: longueur courante
    Do
      mot = Mid(enr, cur, lcur)
      'lecture du mot à coder
      trouve = InStr(1, buff, mot)
      ' trouve = position du mot dans buffer
      If lcur + cur > Len(enr) Then
        ' si dépassement : considéré comme non-trouvé
        trouve = 0
      End If
      If trouve > 0 Then
        ' mot trouvé !
        ' alcur,amot,atrouve : sauvegarde de lcur,mot,trouve
        alcur = lcur
        amot = mot
        lcur = lcur + 1
        ' on va chercher un mot plus long
        atrouve = trouve
      Else
        ' mot non-trouvé
        If lcur < 5 Then
          ' si le mot a été trouvé avant et que sa longueur est < 5
          ' ou que le mot n'a jamais été trouvé
          ' écrire le mot + topage non-codé pour chaque octet écrit
          Put #2, , mot
          ctrl = ctrl & String(lcur, "0")
        Else
          ' sinon, écrire la position trouvée dans le buffer
          Put #2, , atrouve
          ' écrire la longueur du mot trouvé
          Put #2, , alcur
          ' re-définir la longueur actuelle compte tenu du mot trouvé
          lcur = alcur
          ' toper l'enregistrement comme codé
          ctrl = ctrl & "1"
          ' re-définir le mot trouvé
          mot = amot
        End If
        ' stockage du mot en fin de buffer
        buff = buff & mot
        ' on passe en position après le mot
        cur = cur + lcur
        If cur > Len(enr) Then
          ' au-delà de la chaîne
          Exit Do
        Else
          ' longueur en cours réinitialisée à 1
          lcur = 1
        End If
        mot = ""
      End If
    Loop
    ' la chaîne a été totalement explorée:
    ' le buffer a atteint 32764 octets maxi
    ' re-définir le buffer comme étant la chaîne qui vient d'être explorée
    buff = enr
    ' calcul du code de contrôle de codage
    Do
      If Len(ctrl) < 8 Then
        Exit Do
      ElseIf Len(ctrl) = 8 Then
        code = code & Chr(btod(ctrl))
        ctrl = ""
      Else
        code = code & Chr(btod(Left(ctrl, 8)))
        ctrl = Right(ctrl, Len(ctrl) - 8)
      End If
    Loop
    ' note: il peut rester une chaine binaire dans ctrl
  Loop
  limit = Len(code) * 8 + Len(ctrl)
  ' limit: LONG définissant la taille réelle du code binaire de contrôle
  If ctrl <> "" Then
    ' on traite le reliquat de ctrl
    ctrl = ctrl & String(8 - Len(ctrl), "0")
    code = code & Chr(btod(ctrl))
  End If
  ' écriture du 'bloc de fin'
  ' Code de contrôle de codage
  Put #2, , code
  lcode = Len(code)
  ' longueur du code (type LONG)
  Put #2, , lcode
  ' taille réelle du code binaire de contrôle
  Put #2, , limit
  msg = "Taille origine : " & LTrim(Str(LOF(1))) & Chr(13)
  msg = msg & "Taille comprimé: " & LTrim(Str(LOF(2)))
  hr2 = Time
  msg = msg & Chr(13) & "Taux    : " & LTrim(Str(Int(1 - (LOF(2) / LOF(1)) * 100 + 0.5))) & " %"
  msg = msg & Chr(13) & "Vitesse : " & LTrim(Str(Int(LOF(1) / ((hr2 - hr1) * 100000)))) & " octets/seconde"
  Close
End Sub
Sub decompresser1()
  hr1 = Time
  Dim code As String, ctrl As String, buff As String
  Dim pnt As Long, enr As String, cur As Integer, lcur As Integer
  Dim trouve As Integer, limit As Long
  Dim lcode As Long, atrouve As Integer, ecode As Integer, bcode As String
  Dim i As Long, j As Long
  Close
  Open fich1 For Binary As #1
  Close
  Kill fich1
  Open fich0 For Binary As #1
  Open fich1 For Binary As #2
  ' lecture de la taille réelle du code binaire de contrôle
  Get #1, LOF(1) - 3, limit
  ' lecture de la taille du code de contrôle de codage (type LONG = 4 octets)
  Get #1, LOF(1) - 7, lcode
  ' lecture du code de contrôle de codage
  code = String(lcode, " ")
  Get #1, LOF(1) - 7 - lcode, code
  ' définition du buffer à 16 Ko - 2 octets
  buff = String(16382, " ")
  ' lecture
  Get #1, 1, buff
  ' puis écriture puisque non-codé
  Put #2, 1, buff
  pnt = 0
  ' pnt : pointeur de position dans le code binaire de contrôle
  ' lecture du code de contrôle de codage
  For i = 1 To lcode
    ecode = Asc(Mid(code, i, 1))
    bcode = dtob$(ecode)
    ' bcode: chaîne binaire du caractère de contrôle (cf. ctrl dans compresser1)
    For j = 1 To 8
      ' enregistrement attendu par défaut à 1 octet
      pnt = pnt + 1
      enr = " "
      If Mid(bcode, j, 1) = "0" Then
        ' si enregistrement non codé, lecture d'un octet
        Get #1, , enr
      Else
        ' sinon, lecture de la position dans le buffer
        Get #1, , trouve
        ' puis de la taille du mot
        Get #1, , lcur
        ' extraction du mot
        enr = Mid(buff, trouve, lcur)
      End If
      ' ajout du mot au buffer
      buff = buff & enr
      ' écriture du mot
      Put #2, , enr
      If Len(buff) >= 32764 Then
        ' si la taille du buffer exède 32 ko - 4 octets
        ' re-définir le buffer à 16 Ko - 2 octets
        buff = Right(buff, 16382)
      End If
      If pnt = limit Then
        ' si le pointeur est à la limite réelle du code binaire : sortie boucle
        Exit For
      End If
    Next j
    If pnt = limit Then
      ' si le pointeur est à la limite réelle du code binaire : sortie
      Exit For
    End If
  Next i
  msg = "Taille générée: " & LTrim(Str(LOF(2)))
  hr2 = Time
  msg = msg & Chr(13) & "Vitesse : " & LTrim(Str(Int(LOF(2) / ((hr2 - hr1) * 100000)))) & " octets/seconde"
  Close
End Sub
Function btod(x As String)
  ' btod = valeur décimale d'une chaine binaire
  ' fonction Binary TO Decimal
  nn = 0: xx = x: nx = 0
  Do While Len(xx) > 0
    nn = nn + Val(Right(xx, 1)) * (2 ^ nx)
    nx = nx + 1
    xx = Left(xx, Len(xx) - 1)
  Loop
  btod = nn
End Function
Function dtob$(n As Integer)
  ' dtob$ = chaine binaire de 8 caractères
  ' fonction Decimal to Binary
  nn = n: xx = ""
  Do While nn > 0
    xx = Format(nn Mod 2, "0") & xx
    nn = nn  2
  Loop
  dtob$ = Right("00000000" & xx, 8)
End Function
 

Source

  • ' Module développé par Philippe LARASSE le 03.07.2000
  • Option Explicit
  • Dim nx As Long, xx As String, nn As Long, fich0 As String, fich1 As String, msg As String
  • Dim hr1 As Variant, hr2 As Variant
  • Sub Main()
  • Dim lchoix As String
  • msg = ""
  • Do
  • If MsgBox("OUI = Compression , NON = Décompression", vbYesNo, "Essai Comp/Dcomp") = vbYes Then
  • lchoix = "Compresser"
  • Else
  • lchoix = "Décompresser"
  • End If
  • fich0 = InputBox$(lchoix & " quel fichier ?" & Chr(13) & "(Chemin + nom)", lchoix, fich0)
  • If fich0 = "" Then
  • Exit Do
  • Else
  • fich1 = InputBox$(lchoix & " le fichier: " & Chr(13) & fich0 & Chr(13) & "Vers quel fichier ?" & Chr(13) & "(Chemin + nom)", lchoix, fich1)
  • If fich1 = "" Then
  • Exit Do
  • Else
  • If lchoix = "Compresser" Then
  • Call compresser1
  • Else
  • Call decompresser1
  • End If
  • MsgBox msg, vbOKOnly, "Résultat"
  • If MsgBox("Continuer ?", vbYesNo, "COMP/DECOMP") = vbNo Then
  • Exit Do
  • End If
  • End If
  • End If
  • Loop
  • End
  • End Sub
  • Sub compresser1()
  • hr1 = Time
  • Dim code As String, ctrl As String, buff As String
  • Dim pnt As Long, enr As String, cur As Integer, lcur As Integer
  • Dim mot As String, trouve As Integer, limit As Long
  • Dim lcode As Long, atrouve As Integer, alcur As Integer, amot As String
  • Close
  • Open fich1 For Binary As #1
  • Close
  • Kill fich1
  • Open fich0 For Binary As #1
  • Open fich1 For Binary As #2
  • ' lecture par blocs de 16382 octets
  • ' buffer : fenêtre du buffer
  • buff = String(16382, " ")
  • Get #1, 1, buff
  • Put #2, 1, buff
  • ' les 16382 premiers octets ne sont pas compressés
  • ' puisqu'on va chercher dans la chaîne le mot à coder
  • pnt = 16382
  • ' pointeur de lecture
  • Do While pnt < LOF(1)
  • If pnt + 16382 > LOF(1) Then
  • enr = String(LOF(1) - pnt, " ")
  • ' s'il ne reste pas 16382 octets, lire ce qui reste
  • Else
  • ' sinon lire 16382 octets
  • enr = String(16382, " ")
  • End If
  • Get #1, , enr
  • pnt = pnt + Len(enr)
  • ' enr : chaîne à coder
  • cur = 1: lcur = 1: mot = ""
  • ' cur: position courante
  • ' lcur: longueur courante
  • Do
  • mot = Mid(enr, cur, lcur)
  • 'lecture du mot à coder
  • trouve = InStr(1, buff, mot)
  • ' trouve = position du mot dans buffer
  • If lcur + cur > Len(enr) Then
  • ' si dépassement : considéré comme non-trouvé
  • trouve = 0
  • End If
  • If trouve > 0 Then
  • ' mot trouvé !
  • ' alcur,amot,atrouve : sauvegarde de lcur,mot,trouve
  • alcur = lcur
  • amot = mot
  • lcur = lcur + 1
  • ' on va chercher un mot plus long
  • atrouve = trouve
  • Else
  • ' mot non-trouvé
  • If lcur < 5 Then
  • ' si le mot a été trouvé avant et que sa longueur est < 5
  • ' ou que le mot n'a jamais été trouvé
  • ' écrire le mot + topage non-codé pour chaque octet écrit
  • Put #2, , mot
  • ctrl = ctrl & String(lcur, "0")
  • Else
  • ' sinon, écrire la position trouvée dans le buffer
  • Put #2, , atrouve
  • ' écrire la longueur du mot trouvé
  • Put #2, , alcur
  • ' re-définir la longueur actuelle compte tenu du mot trouvé
  • lcur = alcur
  • ' toper l'enregistrement comme codé
  • ctrl = ctrl & "1"
  • ' re-définir le mot trouvé
  • mot = amot
  • End If
  • ' stockage du mot en fin de buffer
  • buff = buff & mot
  • ' on passe en position après le mot
  • cur = cur + lcur
  • If cur > Len(enr) Then
  • ' au-delà de la chaîne
  • Exit Do
  • Else
  • ' longueur en cours réinitialisée à 1
  • lcur = 1
  • End If
  • mot = ""
  • End If
  • Loop
  • ' la chaîne a été totalement explorée:
  • ' le buffer a atteint 32764 octets maxi
  • ' re-définir le buffer comme étant la chaîne qui vient d'être explorée
  • buff = enr
  • ' calcul du code de contrôle de codage
  • Do
  • If Len(ctrl) < 8 Then
  • Exit Do
  • ElseIf Len(ctrl) = 8 Then
  • code = code & Chr(btod(ctrl))
  • ctrl = ""
  • Else
  • code = code & Chr(btod(Left(ctrl, 8)))
  • ctrl = Right(ctrl, Len(ctrl) - 8)
  • End If
  • Loop
  • ' note: il peut rester une chaine binaire dans ctrl
  • Loop
  • limit = Len(code) * 8 + Len(ctrl)
  • ' limit: LONG définissant la taille réelle du code binaire de contrôle
  • If ctrl <> "" Then
  • ' on traite le reliquat de ctrl
  • ctrl = ctrl & String(8 - Len(ctrl), "0")
  • code = code & Chr(btod(ctrl))
  • End If
  • ' écriture du 'bloc de fin'
  • ' Code de contrôle de codage
  • Put #2, , code
  • lcode = Len(code)
  • ' longueur du code (type LONG)
  • Put #2, , lcode
  • ' taille réelle du code binaire de contrôle
  • Put #2, , limit
  • msg = "Taille origine : " & LTrim(Str(LOF(1))) & Chr(13)
  • msg = msg & "Taille comprimé: " & LTrim(Str(LOF(2)))
  • hr2 = Time
  • msg = msg & Chr(13) & "Taux : " & LTrim(Str(Int(1 - (LOF(2) / LOF(1)) * 100 + 0.5))) & " %"
  • msg = msg & Chr(13) & "Vitesse : " & LTrim(Str(Int(LOF(1) / ((hr2 - hr1) * 100000)))) & " octets/seconde"
  • Close
  • End Sub
  • Sub decompresser1()
  • hr1 = Time
  • Dim code As String, ctrl As String, buff As String
  • Dim pnt As Long, enr As String, cur As Integer, lcur As Integer
  • Dim trouve As Integer, limit As Long
  • Dim lcode As Long, atrouve As Integer, ecode As Integer, bcode As String
  • Dim i As Long, j As Long
  • Close
  • Open fich1 For Binary As #1
  • Close
  • Kill fich1
  • Open fich0 For Binary As #1
  • Open fich1 For Binary As #2
  • ' lecture de la taille réelle du code binaire de contrôle
  • Get #1, LOF(1) - 3, limit
  • ' lecture de la taille du code de contrôle de codage (type LONG = 4 octets)
  • Get #1, LOF(1) - 7, lcode
  • ' lecture du code de contrôle de codage
  • code = String(lcode, " ")
  • Get #1, LOF(1) - 7 - lcode, code
  • ' définition du buffer à 16 Ko - 2 octets
  • buff = String(16382, " ")
  • ' lecture
  • Get #1, 1, buff
  • ' puis écriture puisque non-codé
  • Put #2, 1, buff
  • pnt = 0
  • ' pnt : pointeur de position dans le code binaire de contrôle
  • ' lecture du code de contrôle de codage
  • For i = 1 To lcode
  • ecode = Asc(Mid(code, i, 1))
  • bcode = dtob$(ecode)
  • ' bcode: chaîne binaire du caractère de contrôle (cf. ctrl dans compresser1)
  • For j = 1 To 8
  • ' enregistrement attendu par défaut à 1 octet
  • pnt = pnt + 1
  • enr = " "
  • If Mid(bcode, j, 1) = "0" Then
  • ' si enregistrement non codé, lecture d'un octet
  • Get #1, , enr
  • Else
  • ' sinon, lecture de la position dans le buffer
  • Get #1, , trouve
  • ' puis de la taille du mot
  • Get #1, , lcur
  • ' extraction du mot
  • enr = Mid(buff, trouve, lcur)
  • End If
  • ' ajout du mot au buffer
  • buff = buff & enr
  • ' écriture du mot
  • Put #2, , enr
  • If Len(buff) >= 32764 Then
  • ' si la taille du buffer exède 32 ko - 4 octets
  • ' re-définir le buffer à 16 Ko - 2 octets
  • buff = Right(buff, 16382)
  • End If
  • If pnt = limit Then
  • ' si le pointeur est à la limite réelle du code binaire : sortie boucle
  • Exit For
  • End If
  • Next j
  • If pnt = limit Then
  • ' si le pointeur est à la limite réelle du code binaire : sortie
  • Exit For
  • End If
  • Next i
  • msg = "Taille générée: " & LTrim(Str(LOF(2)))
  • hr2 = Time
  • msg = msg & Chr(13) & "Vitesse : " & LTrim(Str(Int(LOF(2) / ((hr2 - hr1) * 100000)))) & " octets/seconde"
  • Close
  • End Sub
  • Function btod(x As String)
  • ' btod = valeur décimale d'une chaine binaire
  • ' fonction Binary TO Decimal
  • nn = 0: xx = x: nx = 0
  • Do While Len(xx) > 0
  • nn = nn + Val(Right(xx, 1)) * (2 ^ nx)
  • nx = nx + 1
  • xx = Left(xx, Len(xx) - 1)
  • Loop
  • btod = nn
  • End Function
  • Function dtob$(n As Integer)
  • ' dtob$ = chaine binaire de 8 caractères
  • ' fonction Decimal to Binary
  • nn = n: xx = ""
  • Do While nn > 0
  • xx = Format(nn Mod 2, "0") & xx
  • nn = nn 2
  • Loop
  • dtob$ = Right("00000000" & xx, 8)
  • End Function
' Module développé par Philippe LARASSE le 03.07.2000

Option Explicit
Dim nx As Long, xx As String, nn As Long, fich0 As String, fich1 As String, msg As String
Dim hr1 As Variant, hr2 As Variant
Sub Main()
  Dim lchoix As String
  msg = ""
  Do
    If MsgBox("OUI = Compression , NON = Décompression", vbYesNo, "Essai Comp/Dcomp") = vbYes Then
      lchoix = "Compresser"
    Else
      lchoix = "Décompresser"
    End If
    fich0 = InputBox$(lchoix & " quel fichier ?" & Chr(13) & "(Chemin + nom)", lchoix, fich0)
    If fich0 = "" Then
      Exit Do
    Else
      fich1 = InputBox$(lchoix & " le fichier: " & Chr(13) & fich0 & Chr(13) & "Vers quel fichier ?" & Chr(13) & "(Chemin + nom)", lchoix, fich1)
      If fich1 = "" Then
        Exit Do
      Else
        If lchoix = "Compresser" Then
          Call compresser1
        Else
          Call decompresser1
        End If
        MsgBox msg, vbOKOnly, "Résultat"
        If MsgBox("Continuer ?", vbYesNo, "COMP/DECOMP") = vbNo Then
          Exit Do
        End If
      End If
    End If
  Loop
  End
End Sub
Sub compresser1()
  hr1 = Time
  Dim code As String, ctrl As String, buff As String
  Dim pnt As Long, enr As String, cur As Integer, lcur As Integer
  Dim mot As String, trouve As Integer, limit As Long
  Dim lcode As Long, atrouve As Integer, alcur As Integer, amot As String
  Close
  Open fich1 For Binary As #1
  Close
  Kill fich1
  Open fich0 For Binary As #1
  Open fich1 For Binary As #2
  ' lecture par blocs de 16382 octets
  ' buffer : fenêtre du buffer
  buff = String(16382, " ")
  Get #1, 1, buff
  Put #2, 1, buff
  ' les 16382 premiers octets ne sont pas compressés
  ' puisqu'on va chercher dans la chaîne le mot à coder
  pnt = 16382
  ' pointeur de lecture
  Do While pnt < LOF(1)
    If pnt + 16382 > LOF(1) Then
      enr = String(LOF(1) - pnt, " ")
      ' s'il ne reste pas 16382 octets, lire ce qui reste
    Else
      ' sinon lire 16382 octets
      enr = String(16382, " ")
    End If
    Get #1, , enr
    pnt = pnt + Len(enr)
    ' enr : chaîne à coder
    cur = 1: lcur = 1: mot = ""
    ' cur: position courante
    ' lcur: longueur courante
    Do
      mot = Mid(enr, cur, lcur)
      'lecture du mot à coder
      trouve = InStr(1, buff, mot)
      ' trouve = position du mot dans buffer
      If lcur + cur > Len(enr) Then
        ' si dépassement : considéré comme non-trouvé
        trouve = 0
      End If
      If trouve > 0 Then
        ' mot trouvé !
        ' alcur,amot,atrouve : sauvegarde de lcur,mot,trouve
        alcur = lcur
        amot = mot
        lcur = lcur + 1
        ' on va chercher un mot plus long
        atrouve = trouve
      Else
        ' mot non-trouvé
        If lcur < 5 Then
          ' si le mot a été trouvé avant et que sa longueur est < 5
          ' ou que le mot n'a jamais été trouvé
          ' écrire le mot + topage non-codé pour chaque octet écrit
          Put #2, , mot
          ctrl = ctrl & String(lcur, "0")
        Else
          ' sinon, écrire la position trouvée dans le buffer
          Put #2, , atrouve
          ' écrire la longueur du mot trouvé
          Put #2, , alcur
          ' re-définir la longueur actuelle compte tenu du mot trouvé
          lcur = alcur
          ' toper l'enregistrement comme codé
          ctrl = ctrl & "1"
          ' re-définir le mot trouvé
          mot = amot
        End If
        ' stockage du mot en fin de buffer
        buff = buff & mot
        ' on passe en position après le mot
        cur = cur + lcur
        If cur > Len(enr) Then
          ' au-delà de la chaîne
          Exit Do
        Else
          ' longueur en cours réinitialisée à 1
          lcur = 1
        End If
        mot = ""
      End If
    Loop
    ' la chaîne a été totalement explorée:
    ' le buffer a atteint 32764 octets maxi
    ' re-définir le buffer comme étant la chaîne qui vient d'être explorée
    buff = enr
    ' calcul du code de contrôle de codage
    Do
      If Len(ctrl) < 8 Then
        Exit Do
      ElseIf Len(ctrl) = 8 Then
        code = code & Chr(btod(ctrl))
        ctrl = ""
      Else
        code = code & Chr(btod(Left(ctrl, 8)))
        ctrl = Right(ctrl, Len(ctrl) - 8)
      End If
    Loop
    ' note: il peut rester une chaine binaire dans ctrl
  Loop
  limit = Len(code) * 8 + Len(ctrl)
  ' limit: LONG définissant la taille réelle du code binaire de contrôle
  If ctrl <> "" Then
    ' on traite le reliquat de ctrl
    ctrl = ctrl & String(8 - Len(ctrl), "0")
    code = code & Chr(btod(ctrl))
  End If
  ' écriture du 'bloc de fin'
  ' Code de contrôle de codage
  Put #2, , code
  lcode = Len(code)
  ' longueur du code (type LONG)
  Put #2, , lcode
  ' taille réelle du code binaire de contrôle
  Put #2, , limit
  msg = "Taille origine : " & LTrim(Str(LOF(1))) & Chr(13)
  msg = msg & "Taille comprimé: " & LTrim(Str(LOF(2)))
  hr2 = Time
  msg = msg & Chr(13) & "Taux    : " & LTrim(Str(Int(1 - (LOF(2) / LOF(1)) * 100 + 0.5))) & " %"
  msg = msg & Chr(13) & "Vitesse : " & LTrim(Str(Int(LOF(1) / ((hr2 - hr1) * 100000)))) & " octets/seconde"
  Close
End Sub
Sub decompresser1()
  hr1 = Time
  Dim code As String, ctrl As String, buff As String
  Dim pnt As Long, enr As String, cur As Integer, lcur As Integer
  Dim trouve As Integer, limit As Long
  Dim lcode As Long, atrouve As Integer, ecode As Integer, bcode As String
  Dim i As Long, j As Long
  Close
  Open fich1 For Binary As #1
  Close
  Kill fich1
  Open fich0 For Binary As #1
  Open fich1 For Binary As #2
  ' lecture de la taille réelle du code binaire de contrôle
  Get #1, LOF(1) - 3, limit
  ' lecture de la taille du code de contrôle de codage (type LONG = 4 octets)
  Get #1, LOF(1) - 7, lcode
  ' lecture du code de contrôle de codage
  code = String(lcode, " ")
  Get #1, LOF(1) - 7 - lcode, code
  ' définition du buffer à 16 Ko - 2 octets
  buff = String(16382, " ")
  ' lecture
  Get #1, 1, buff
  ' puis écriture puisque non-codé
  Put #2, 1, buff
  pnt = 0
  ' pnt : pointeur de position dans le code binaire de contrôle
  ' lecture du code de contrôle de codage
  For i = 1 To lcode
    ecode = Asc(Mid(code, i, 1))
    bcode = dtob$(ecode)
    ' bcode: chaîne binaire du caractère de contrôle (cf. ctrl dans compresser1)
    For j = 1 To 8
      ' enregistrement attendu par défaut à 1 octet
      pnt = pnt + 1
      enr = " "
      If Mid(bcode, j, 1) = "0" Then
        ' si enregistrement non codé, lecture d'un octet
        Get #1, , enr
      Else
        ' sinon, lecture de la position dans le buffer
        Get #1, , trouve
        ' puis de la taille du mot
        Get #1, , lcur
        ' extraction du mot
        enr = Mid(buff, trouve, lcur)
      End If
      ' ajout du mot au buffer
      buff = buff & enr
      ' écriture du mot
      Put #2, , enr
      If Len(buff) >= 32764 Then
        ' si la taille du buffer exède 32 ko - 4 octets
        ' re-définir le buffer à 16 Ko - 2 octets
        buff = Right(buff, 16382)
      End If
      If pnt = limit Then
        ' si le pointeur est à la limite réelle du code binaire : sortie boucle
        Exit For
      End If
    Next j
    If pnt = limit Then
      ' si le pointeur est à la limite réelle du code binaire : sortie
      Exit For
    End If
  Next i
  msg = "Taille générée: " & LTrim(Str(LOF(2)))
  hr2 = Time
  msg = msg & Chr(13) & "Vitesse : " & LTrim(Str(Int(LOF(2) / ((hr2 - hr1) * 100000)))) & " octets/seconde"
  Close
End Sub
Function btod(x As String)
  ' btod = valeur décimale d'une chaine binaire
  ' fonction Binary TO Decimal
  nn = 0: xx = x: nx = 0
  Do While Len(xx) > 0
    nn = nn + Val(Right(xx, 1)) * (2 ^ nx)
    nx = nx + 1
    xx = Left(xx, Len(xx) - 1)
  Loop
  btod = nn
End Function
Function dtob$(n As Integer)
  ' dtob$ = chaine binaire de 8 caractères
  ' fonction Decimal to Binary
  nn = n: xx = ""
  Do While nn > 0
    xx = Format(nn Mod 2, "0") & xx
    nn = nn  2
  Loop
  dtob$ = Right("00000000" & xx, 8)
End Function

Commentaires et avis

signaler à un administrateur
Commentaire de Renfield le 23/01/2006 16:26:20 administrateur CS

un Zip est requis.
Merci

Renfield - Admin CodeS-SourceS

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Installation, compression, decompression [ par verbateam2002 ] Bonjour,Je cherche à faire un programme qui va decompresser automatiquement des fichiers (avec une architecture définie) vers un disque que l'on aura 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 winzip compression avertissement [ par Jomba ] lorsque je compresse toute une s&#233;rie de fichier avec un shell sur winzip, j'obtient &#224; la fin un message d'avertissement car l'un des fichier 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 Compression Fichiers [ par yohann2004 ] Bonjour, Est-il possible de compresser un fichier directement à partir de vb.net ? Est-ce qu'une classe intégrée existe dans la version VB.net antéri COMPRESSION BASE SQL [ par maxRS ] Bonjour a tousJe voudrais connaitre le code en VB6 pour compresser une base SQL!Merci d'avanceBonne journée a tousmaxRS savoir l'état des bits d'un octet [ par nardelmouk ] souhaitant faire un petit algorithme de compression, j'avais vu que touts les lettres de l'alphabet ne prenaient pas plus de 5 bits d'un octet donc je Compression GZip .NET 2.0 [ par EvilGost ] Bonjour à tous les développeurs,je suis actuellement confronté à un problème. Pour mon appli, je dois compresser un répertoire complete, via GZip, int Attendre la fin de Compression avec Winrar sous VB2005 [ par ledebutant07 ] Bonjour,Je suis sous VB2005 ExpressJ'écris une appli qui compresse un répertoire et ses sous-répertoire avec WINRAR .Je cherche comment coder l'attent Compression image [ par nicodada ] Explication:-Une image de 128*64 pixels (picture box)-2 niveaux de couleurs (noir et blanc);(1;0)-2 fonctions possible pour enregistrer l'image    poi


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

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



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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,624 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é.