IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Compression d'un binaire


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 33
    Par défaut Compression d'un binaire
    Nous travaillons sur cet exercice et on a trouvé des difficultés à le résoudre.
    SVP, si vous pouvez nous aider à le resoudre


    Un CODEC est un logiciel compresseur décompresseur de fichiers. En effet, les suite de bits composant un fichier
    comportent des similitudes comme 10000111. Plutôt que de stocker la totalité de cet octet, on gagne de la place en
    écrivant 14031 (qui se lit un quatre zéros trois un). Cet octet (huit bits) retrouva ensuite son format original à la
    décompression.
    Il s'agit alors de saisir une chaîne de huit chiffres formée uniquement 0 et 1 pour désigner un octet puis la compresser
    suivant le principe de compression du CODEC et enfin l'afficher.
    Exemple :
    Si octet = ˝10010111˝ Alors l'octet compressé est : ˝1201031˝


    Voici le code VB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Module
    Module1 
    Sub Main() 
    Dim tab() As String 
    Dim ok As Boolean = True 
    Dim i, l, occ As Integer 
    Dim car As String 
    Dim octet As String = "" 
    Dim oct As String 
    Console.WriteLine(
    "Tapez la valeur de l'octet") 
    oct = Console.ReadLine
    l = oct.Length
    ReDim tab(l) 
    For i = 0 To l - 1 
    tab(i) = oct.Substring(i, 1)
    Console.WriteLine(tab(i))
    Next 
     
    Do 
    If tab(i) <> 0 Or tab(i) <> 1 Then 
    i = i + 1
    End If 
    Loop Until (ok = False) Or (i > 8) And l = 8 
    i = 1
    Do 
    occ = 1
    ok = 
    True 
    Do 
    If tab(i) = tab(i + 1) Then 
    occ = occ + 1
    i = i + 1
    Else 
    ok = 
    False 
    End If 
    Loop Until ok = False Or i > 8 
    If occ = 1 Then 
    octet = oct & occ
    Else 
    Console.WriteLine(oct & occ)
    End If 
    i = i + 1
    Loop Until i > 8 
    Console.WriteLine(
    "l'octet compressé est" & octet) 
    Console.ReadKey()
    End Sub 
    End
    Module

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    J'étais habitué à voir le CODEC comme un logiciel qui fait que j'ai de la vidéo et du son sur mon pc ...

    Blague à part, peut de nous seront prêt à faire l'exercice pour toi. Alors dit nous précisément sur quel point tu bloques (qu'est-ce que ton code fait ? qu'est-ce qu'il fait mal ?, etc..).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 33
    Par défaut
    je ne reçoit pas message d'erreur.
    Il boucle à l'infinie.

    Je suis débutant en VB et j'ai voulu travailler cet exercice.
    Si vous pouvez m'aider à le réaliser

    merci

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Je hais le vb...
    Bon, quelques remarques :
    Alors que je pensais que ReDim tab(l) créait un tableau de taille l, il crée un tableau de taille (l+1) alors déjà utilise ReDim tab(l-1). (Pourquoi crée un tableau de 9 cases pour stocker 8 éléments ?)

    Apparemment tu te perds avec les Do..While (et moi aussi d'ailleurs, c'est illisible). Essayes de refaire ton programme avec que des boucles For, au moins là tu vois exactement d'où tu pars et où tu arrives alors que là j'ai l'impression que la condition de fin est faite un peut au hasard ...

    Du coup fait attention, ton i doit aller pour un tableau de 8 éléments de 0 à 6 car 6+1=7 est valide mais pas 7+1=8 (on compte à partir de 0, donc l'élément 8 sur un tableau de 8 éléments n'existe pas).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If occ = 1 Then
                    octet = oct & occ
                Else
                    Console.WriteLine(oct & occ)
                End If
    Dans le cas "Else", comment tu rajoutes occ dans oct ? donc finalement le occ tu le laisses dans le néant j'ai l'impression, il faudrait toujours faire octet = oct & occ (quelle abération, utiliser & pour concaténer, l'est bizarre VB )

    C'est tout pour l'instant, essayes de refaire avec les z'indications.

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Cela dit concernant ton algorithme, j'espère que tu vous avez bien analysé les probabilités des séquences de données, car dans le cas le moins favorable, ton fichier compressé fera le double du fichier initial.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  6. #6
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Cela dit concernant ton algorithme, j'espère que tu vous avez bien analysé les probabilités des séquences de données, car dans le cas le moins favorable, ton fichier compressé fera le double du fichier initial.
    Si tu parles du fait de rencontrer:
    1 0 1 0 1 0

    Et que le CODEC le modifie en:
    11 10 11 10 11 10

    Je crois pas que ça fasse ça selon la description initial de notre ami. Du moins j'espère bien, sinon c'est complètement stupide..héhé

    C'est tout de même intéressant comme compression...
    http://fr.wikipedia.org/wiki/Codec

  7. #7
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Bon j'avais du temps à perdre...

    Sous VS08.
    Ça ouvre avec un OpenFileDialog le fichier voulu.
    Crée un fichier avec le même nom + "codé".
    Compresse à la manière initiale, et pas que les 1/0 mais n'importe quel char qui se répête (TOUS! chiffres, lettre, espace, etc.)
    Écrit le résultat dans le nouveau fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
        Private Sub BTOuvrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTOuvrir.Click
            Dim SR As StreamReader = Nothing
            Dim SW As StreamWriter = Nothing
            Dim fichier As Stream
            Dim OFD As New OpenFileDialog
            Dim tampon As Char = ""
            Dim compteur As Integer = 1
            Dim fin As Boolean = False
     
            OFD.InitialDirectory = "c:\"
            OFD.FileName = ""
            OFD.Filter = "Text files (*.txt)|*.txt"
            OFD.FilterIndex = 2
            OFD.RestoreDirectory = True
            OFD.ShowDialog()
            fichier = OFD.OpenFile()
     
            SR = New StreamReader(fichier)
            SW = File.CreateText(Replace(OFD.FileName, ".txt", "") + "_codé.txt")
     
            tampon = Convert.ToChar(SR.Read)
     
            While SR.EndOfStream = False
                While tampon = Convert.ToChar(SR.Peek())
                    tampon = Convert.ToChar(SR.Read)
                    compteur += 1
     
                    If SR.Peek = -1 Then
                        fin = True
                        Exit While
                    End If
                End While
     
                If compteur > 1 Then
                    SW.Write(compteur.ToString + tampon)
                Else
                    SW.Write(tampon)
                End If
     
                If fin = False Then
                    tampon = Convert.ToChar(SR.Read)
                    compteur = 1
                End If
            End While
     
            If compteur = 1 Then
                SW.Write(tampon)
            End If
     
            SR.Close()
            SW.Close()
     
        End Sub
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1110000 000 aaaaaaaaaa   b     10 10    111   00
    Devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    3140 30 10a3 b5 10 104 313 20
    J'ai fait passé un fichier complétement aléatoire de 1/0 de 160kb à 124kb
    J'ai fait passé un fichier truqué de 47kb à 2kb

    C'est pas parfait et je sais que en décodant il y aura des problèmes comme:

    1111111111 =codé= 101 =décodé= 101

    D'où le fait de les groupés par octet sûrement...

    Mais bon là je n'ai plus de temps à perdre...héhéhé

  8. #8
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Au fait ce que "vous" essayez de faire est sur quasiment le même principe que la compression RLE. Celà pourrai te donner des idées ...

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Par défaut
    10000111 donne 14031 (qui se lit un quatre zéros trois un).
    Question a 2 bits ...
    Et pourquoi pas 1143 qui serait plus court ...
    - 1 : La séquence commence par 1 "un"
    - 1 : 1 "un"
    - 4 : 4 "zero"
    - 3 : 3 "un"

  10. #10
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut
    Citation Envoyé par smyley Voir le message
    Au fait ce que "vous" essayez de faire est sur quasiment le même principe que la compression RLE. Celà pourrai te donner des idées ...
    Oui, c'est meme quasi la meme chose
    Mais vous vous cassez la tete juste pour pas grand chose, car c'est juste un exercice :
    Citation Envoyé par dolsky Voir le message
    Je suis débutant en VB et j'ai voulu travailler cet exercice.
    Citation Envoyé par Totanne Voir le message
    Et pourquoi pas 1143 qui serait plus court ...
    Ca c'est deja plus interessant mon cher
    Juste que imaginons dans le pire des cas : 10101010 ca augmente la chose ... (reflexion) ... mais dans ce cas, on peut se baser sur du 64/256 bits

  11. #11
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Ah intéressant...

    En passant est-ce que dolsky suit encore la discussion...j'ai l'impression que c'est devenu un forum public sur les CODECs.

    haha

    Faudrait peut-être mettre résoudre

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Par défaut
    En fait si on veut faire court, le meilleur codec c'est celui ou 1111 1111 donne 255 ...

Discussions similaires

  1. Compression d'une image binaire
    Par faaat dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 07/05/2012, 20h44
  2. Compression et opérateurs binaires
    Par av0gadr0 dans le forum C
    Réponses: 4
    Dernier message: 25/01/2011, 02h41
  3. compression d'une chaine binaire
    Par Nehmé dans le forum Mathématiques
    Réponses: 11
    Dernier message: 29/07/2010, 15h50
  4. compression de données du point de vue algorithmique
    Par GoldenEye dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 26/06/2002, 15h51
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo