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 :

Lire une en-tête de fichier binaire [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut Lire une en-tête de fichier binaire
    Bonjour tous le monde, je vais avoir besoin de votre aide une nouvelle fois.

    je dois lire des informations dans des fichiers dont je ne connais pas l'encodage. Voici ce que j'obtiens après avoir utilisé le petit bout de code ci-dessous sur 2 fichiers qui sont à peu prés représentatif de ce que l'on peux trouver :

    PS : j'ai séparer chaque octet par des virgules pour que vous puissiez lire.
    Fichier 1 :
    3,0,0,0,1,0,0,0,20,0,0,0,Valeur1,15,0,0,0,Valeur2,4,0,0,0,Valeur3,9,0,0,0,Valeur4,48,48,116,62,..........etc
    Fichier 2 :
    3,0,0,0,1,0,0,0,7,0,0,0,Valeur1,15,0,0,0,Valeur2,4,0,0,0,Valeur3,9,0,0,0,Valeur4,48,48,213,96,..........etc

    On retrouve donc plusieurs fois des séquences d'octets qui ne sont pas forcement toujours les mêmes (Exemple : 20,0,0,0 et 7,0,0,0)
    Valeur1 à Valeur4 représente les octets qui m'interressent que je peux lire facilement une fois convertie dans la variable 'result'.

    PROBLEME : Je sais déja que je vais avoir à faire des comparaisons de groupes d'octets mais avant tout j'aimerais avoir votre avis pour savoir si il vaux mieux comparer les octets 2 par 2 ou 4 par 4 ? Et ensuite comment stocker dans des constantes des mots de 2 ou 4 octets pour ensuite les comparer ?

    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
     Public Sub TraduireFichierBinaire(chemin_fichier As String)
            ' Vérification de l'entête du fichier 
            Dim buffer_lecture As Byte() = Nothing
            Dim LectureStream As Stream = File.Open(chemin_fichier, FileMode.Open)
            Dim LectureStreamReader As New BinaryReader(LectureStream)
     
            Try
                ' lecture des 80 octets de l'entête 
                buffer_lecture = LectureStreamReader.ReadBytes(80)
     
                ' Création d'un flux d'écriture
                Dim Fi As New FileInfo(chemin_fichier)
                Dim sw As New StreamWriter(Doc_Directory & "\" & Fi.Name & ".txt")
                ' écriture        
                For Each _Byte As Byte In buffer_lecture
                    sw.WriteLine(CStr(_Byte))
                Next
                sw.Close()
     
                Dim Result As String = System.Text.Encoding.UTF8.GetString(CType(buffer_lecture, Byte()))
                ' Dim Result As String = Convert.ToString(buffer_lecture)
     
            Catch generatedExceptionName As IOException
     
            End Try
     
            LectureStream.Close()
            LectureStreamReader.Close()
     
        End Sub
    D'avance, Merci à vous...

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Je me réponds à moi-même
    Voici ce que je compte faire pour comparer les mots su 4 Octets :
    Je convertie en Int32 ainsi chaque groupe de 4 Octets à une valeur bien distinct ce qui n'est pas le cas lorsque on convertie en String.
    De plus ça na pas vraiment de sens si on ne connais pas l'encodage de caractère utilisé dans le 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
     
            Dim bytes1() As Byte = {1, 0, 0, 0}
            Dim bytes2() As Byte = {20, 0, 0, 0}
     
            'Dim Mot1 As String = Convert.ToString(bytes1)
            'Dim Mot2 As String = Convert.ToString(bytes2)
     
            'Dim Mot1 As String = System.Text.Encoding.Unicode.GetString(bytes1)
            'Dim Mot2 As String = System.Text.Encoding.Unicode.GetString(bytes2)
     
            'Dim Mot1 As String = BitConverter.ToString(bytes1)
            'Dim Mot2 As String = BitConverter.ToString(bytes2)
     
            Dim Mot1 As Int32 = BitConverter.ToInt32(bytes1, 0)
            Dim Mot2 As Int32 = BitConverter.ToInt32(bytes2, 0)
     
            If Mot1 = Mot2 Then 
                 ......
            End If

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour

    Quand on ne connait pas l'encodage d'un fichier ,c.à.d. le type des groupes de bytes ,il faut utiliser le type Byte qui est le type de base ...
    Tout est byte en dernier ressort !!!
    Les autres types abstraits (int32,double,string etc...) ne sont que des "présomptions" que nous faisons sur les groupes de données lues ou écrites ...
    Comme tu as des groupes de 4 bytes ,c'est un structure de 4 bytes qu'il te faut et après tu compare tes structures avec Equals...
    bon code...

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir merci beaucoup pour vos conseils...
    J'ai commencé à écrire une classe, l'idée c'est de stocker tous les groupes "clés" de 2 ou 4 octets dans un Dictionary(of Key, KeyWord) afin de pouvoir comparer les octets du fichier avec le contenu du dictionnaire.

    Je construit mes objets KeyWord avec 1, 2 ou 4 Octets et ils me fournissent une clé de type Int32 issu de la conversion BitConverter.ToInt32(Bytes as bytes(), Index as integer).
    Ainsi pour chaque groupes d'octets trouvé dans mon fichier je peux calculer la clé qui me sert à vérifier si le groupe existe dans le dictionnaire et éventuellement pour récupérer mon objet KeyWord.

    Le problème c'est que BitConverter ne fonctionne pas avec avec un seul Octet (j'ai pas compris pourquoi) et de plus ce serait une valeur abstraite donc
    Du coup je me retrouve avec une solution qui pourrait fonctionner mais qui ne me convient qu'à moitié...

    j'ai tenté de fournir directement le tableau Bytes() as byte comme clé du dictionnaire mais ça ne fonctionne pas (apparament le dictionary ne va pas chercher les Octets du tableau un par un pour les comparer).

    Du coup Equals pourrait peut t'être m'aider mais comment comment je peux faire pour atteindre mes keyWord rapidement sans les comparer un à un....Avec le dictionary c’était facile, je pouvais faire un if dictionary.containskey(key as int32) pour vérifier rapidement.....

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir à tous, je suis toujours bloqué, si quelqu'un pouvez m'aider à avancer un peu ça serait vraiment sympa.

    Je ne comprends pas pourquoi d’après MABROUKI, je ne pourrais pas avoir une représentation en entier 32bits de chaque groupes d'octets.
    Si je ne dit pas de bêtise 2 Octets 8 bits comme {255, 255} ou 11111111 11111111 en binaire c'est égale à 65535 en Entier 32 bits....
    Après j'ai un message d'erreur selon les valeurs que je rentre dans la fonction Bitconverter.toInt32 :

    Valeurs qui lève une exception (il y en a surement d'autres mais c'est pour l'exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Bytes1 as byte() = {3}
    Dim Bytes2 as byte() = {0 ,0}
    La fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Value As Int32 = BitConverter.ToInt32(bytes1, 0)
    Le message d'erreur :
    Le tableau de destination n'est pas assez long pour permettre la copie de tous les éléments dans la collection. Vérifiez l'index et la longueur du tableau.

    EDIT : C'est bon, j'ai fini par comprendre : Bitconverter.toInt32 n'accepte que des groupes de 4 octets, sinon il faut utiliser Bitconverter.ToInt16 pour les groupes de 2 octets ou convert.toInt32 pour un seul octet.
    Je comprend aussi que ce n'est pas une bonne idée d'utiliser une valeur Entiere comme clé puisque la même valeur peut correspondre à 1, 2 ou 4 Groupes d'octets.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Je passe en résolu, mon code fonctionne parfaitement

    J'ai utilisé BitConverter.ToString(bytes of byte()) comme clé de mon dictionnaire qui me permet d'identifier tous les Octets importants quel que soit leurs nombre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [débutant] numpy, lire une portion d'un fichier binaire.
    Par GuyXL dans le forum Général Python
    Réponses: 9
    Dernier message: 04/11/2015, 15h16
  2. Comment lire une chaîne dans un fichier binaire?
    Par dot-_-net dans le forum Débuter
    Réponses: 9
    Dernier message: 18/05/2008, 23h13
  3. [VB6]Lire une partie d'un fichier .txt
    Par patoch76 dans le forum VB 6 et antérieur
    Réponses: 26
    Dernier message: 02/05/2006, 20h49
  4. Sauvegarder/Lire une classe dans un fichier
    Par Rodrigue dans le forum C++
    Réponses: 10
    Dernier message: 10/09/2005, 14h12
  5. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20

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