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

Python Discussion :

Lecture de fichier binaire


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut Lecture de fichier binaire
    Bonjour,

    J'essaie de decoder un fichier binaire

    voici le format de fichier que je trouve dans la doc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Field  Byte                              Offset
    WORD  MagicNumber               0
    BYTE HeaderType                     2
    BYTE SerialPort                        3
    WORD NumChansToFollow        4
    WORD Reserved[2]                  6
    DWORD NumBytesThisRecord   10
    WORD Year                             14

    Et avant, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Microsoft Data Type  Bytes
    BYTE                       1
    WORD                     2
    DWORD                   4
    Dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(struct.unpack('<HBBH2HI', binary))
    où binary est ma séquence d'octets, et j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (64206, 0, 0, 2, 0, 0, 2384)
    soit 7 valeurs, alors que je n'ai que 6 champs au départ. il semble qu'il considère le 2H comme 2 WORD indépendants, ce que semble confirmer un post ici

    du coup, quand je veux ensuite mettre ça dans un namedtuple, ça ne marche pas. Je n'ai pas de message d'erreur, mais rien ne s'affiche avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ll = 'MagicNumber HeaderType SubChannelNumber NumChansToFollow Reserved NumBytesThisRecord'
            nt = namedtuple('mytuple', ll)
            self.data = nt._make(struct.unpack(fmt, self.binary))
     
            print('data', self.data)
            dd = self.data._asdict()
     
            for v in dd.keys():
                print(v, dd[v])

    Comment faire ?

    Merci,
    Nico

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par DiverSIG Voir le message
    Bonjour,
    Salut

    Citation Envoyé par DiverSIG Voir le message
    J'essaie de decoder un fichier binaire ... Et avant, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Microsoft Data Type  Bytes
    BYTE                       1
    WORD                     2
    DWORD                   4
    Tout d'abord c'est quoi ce "avant" ? Un en-tête du fichier ? De la ligne ?

    Citation Envoyé par DiverSIG Voir le message
    et j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (64206, 0, 0, 2, 0, 0, 2384)
    soit 7 valeurs, alors que je n'ai que 6 champs au départ
    Ben non, tu as bien 7 champs. "MagicNumber", "HeaderType", "SerialPort", "NumChansToFollow", "Reserved", "NumBytesThisRecord" et "Year" ça fait bien 7 !!!??? Bon 2384 pour Year ça semble un peu "futuriste" mais pourquoi pas...

    Citation Envoyé par DiverSIG Voir le message
    Comment faire ?
    Le mieux serait d'avoir le fichier (ou une petite partie) pour tester de notre côté. Tu pourrais (s'il n'est pas confidentiel) nous le mettre sur un site de dépot temporaire tel que https://www.grosfichiers.com/. Ou s'il est public nous donner le lien de téléchargement...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Le "avant", c'est plus haut dans la doc.

    Je ne lis pas le champ Year, c'était juste pour monter qu'il est à l'offset 14. En fait je lis les 14 premiers octets de mon enregistrement

    voici la séquence d'octets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b'\xce\xfa\x00\x00\x02\x00\x00\x00\x00\x00P\t\x00\x00'
    Nico

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 279
    Points : 36 765
    Points
    36 765
    Par défaut
    Salut,

    Citation Envoyé par DiverSIG Voir le message
    soit 7 valeurs, alors que je n'ai que 6 champs au départ. il semble qu'il considère le 2H comme 2 WORD indépendants
    H est pour word, et le 2 en extrait 2 indépendants. C'est comme çà que vous avez traduit le champ RESERVED[2]: 2 words qui occupent 2*2 = 4 octets.

    Après la question est de savoir si ce RESERVED est utilisé (différent de zéro parfois) ou effectivement réservé pour une utilisation future.... et arbitrer entre remplacer 2H par un L (qui occupe 4 bytes) ou retravailler le tuple pour qu'il n'ait que 6 valeurs.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par DiverSIG Voir le message
    voici la séquence d'octets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b'\xce\xfa\x00\x00\x02\x00\x00\x00\x00\x00P\t\x00\x00'
    Si j'ai bien calculé, le DWord c'est la partie en rouge.
    Voici ce que j'ai fait: je me suis concentré sur cette seule partie data=b"\x50\x09\x00\x00" (le 0x50 c'est le 'P' et le 0x09 c'est le '\t').
    Effectivement, struct.unpack("<2H", data) donne (2384, 0) mais c'est normal, "2H" signifie "2 ushort" (cf la doc). Donc le truc te récupère 2 ushorts indépendants
    Ensuite comme la doc dit qu'un DWord c'est 32 bits "ensembles" j'ai tenté struct.unpack("<L", data) ce qui donne simplement (2384,). N'est-ce pas juste la valeur à récupérer?

    PS: le calcul 9*256+0x50 donne effectivement 2384. Et si on inverse avec struct.unpack(">L", data) ça donne (1342767104,) ce qui correspond parfaitement au calcul (((0x50*256)+9)*256)*256. Tout semble cohérent...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    effectivement le Reserved ne semble pas présent dans tes données binaires puisqu'il n'y a que 14 octets.
    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import collections
    import struct
    binary = b'\xce\xfa\x00\x00\x02\x00\x00\x00\x00\x00P\t\x00\x00'
    ll = 'MagicNumber HeaderType SubChannelNumber NumChansToFollow NumBytesThisRecord Year'
    nt = collections.namedtuple('mytuple', ll)
    data = nt._make(struct.unpack('HBBHIH', binary))
     
     
    print('data', data)
    dd = data._asdict()
     
     
    for v in dd.keys():
        print(v, dd[v])
    voici ce que j'obtiens :
    data mytuple(MagicNumber=64206, HeaderType=0, SubChannelNumber=0, NumChansToFollow=2, NumBytesThisRecord=156237824, Year=0)
    MagicNumber 64206
    HeaderType 0
    SubChannelNumber 0
    NumChansToFollow 2
    NumBytesThisRecord 156237824
    Year 0
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    effectivement le Reserved ne semble pas présent dans tes données binaires puisqu'il n'y a que 14 octets.
    Euh... moi j'avais compris qu'il ne lisait volontairement que 14 octets sur les 16 présents. Si effectivement la ligne n'en contient que réellement 14 au lieu de 16 ça change pas mal de choses...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 279
    Points : 36 765
    Points
    36 765
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    effectivement le Reserved ne semble pas présent dans tes données binaires puisqu'il n'y a que 14 octets.
    Le PO a écrit qu'il a viré le YEAR:
    Je ne lis pas le champ Year, c'était juste pour monter qu'il est à l'offset 14. En fait je lis les 14 premiers octets de mon enregistrement
    donc on se retrouve avec les 14 premier octets de la séquence qui nous intéresse.

    Et on reproduit bien le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> b = b'\xce\xfa\x00\x00\x02\x00\x00\x00\x00\x00P\t\x00\x00'
    >>> len(b)
    14
    >>> import struct
    >>> struct.unpack('<HBBH2HI', b)
    >>> len(_)
    7
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    OK,
    donc avec ce code cela devrait être pas trop mauvais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import collectionsimport struct
    binary = b'\xce\xfa\x00\x00\x02\x00\x00\x00\x00\x00P\t\x00\x00'
    ll = 'MagicNumber HeaderType SubChannelNumber NumChansToFollow Reserved NumBytesThisRecord'
    nt = collections.namedtuple('mytuple', ll)
    data = nt._make(struct.unpack('<HBBHII', binary))
    print('data', data)
    dd = data._asdict()
    for v in dd.keys():
        print(v, dd[v])
    Résultat :
    data mytuple(MagicNumber=64206, HeaderType=0, SubChannelNumber=0, NumChansToFollow=2, Reserved=0, NumBytesThisRecord=2384)
    MagicNumber 64206
    HeaderType 0
    SubChannelNumber 0
    NumChansToFollow 2
    Reserved 0
    NumBytesThisRecord 2384
    J'ai remplacé le 2H par un I

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    J'ai remplacé le 2H par un I
    Hey, moi j'ai mis un "L" mais un "I" ça peut le faire aussi (juste vérifier si la data est signée ou pas)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    on peut faire comme ça aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import collections
    import struct
    binary = b'\xce\xfa\x00\x00\x02\x00\x00\x00\x00\x00P\t\x00\x00'
    ll = 'MagicNumber HeaderType SubChannelNumber NumChansToFollow Reserved1 Reserved2 NumBytesThisRecord'
    nt = collections.namedtuple('mytuple', ll)
    data = nt._make(struct.unpack('<HBBH2HI', binary))
    print('data', data)
    dd = data._asdict()
    for v in dd.keys():
        print(v, dd[v])
    data mytuple(MagicNumber=64206, HeaderType=0, SubChannelNumber=0, NumChansToFollow=2, Reserved1=0, Reserved2=0, NumBytesThisRecord=2384)
    MagicNumber 64206
    HeaderType 0
    SubChannelNumber 0
    NumChansToFollow 2
    Reserved1 0
    Reserved2 0
    NumBytesThisRecord 2384

    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. Lecture de fichier binaire
    Par nuans dans le forum MATLAB
    Réponses: 23
    Dernier message: 21/05/2007, 10h00
  2. Lecture de fichier binaire et gestion de fin de fichier
    Par habasque dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 02/05/2007, 17h06
  3. lecture ecriture fichier binaire
    Par jonckers dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/04/2007, 09h12
  4. Réponses: 5
    Dernier message: 26/03/2007, 01h30
  5. lecture de fichier binaire
    Par Salim6 dans le forum C
    Réponses: 3
    Dernier message: 07/11/2005, 19h56

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