Comments on: Lire un format binaire en Python avec struct http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/ Du code, du cul Mon, 28 Oct 2019 11:54:55 +0000 hourly 1 https://wordpress.org/?v=4.9.7 By: Sam http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-193156 Fri, 23 Mar 2018 10:06:00 +0000 http://sametmax.com/?p=16503#comment-193156 cffi doit pouvoir faire ça.

]]>
By: bizulk http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-193143 Wed, 21 Mar 2018 16:25:01 +0000 http://sametmax.com/?p=16503#comment-193143 Salut !

Merci pour ce petit tuto et merci aussi @YCL1 pour le commentaire.

Je préfère ctypes pour l’aspect “déclaratif” de la donnée.

Cela dit j’aimerais bien un outil qui génère la déclaration de la classe(ASN1 si j’ai bien compris) à partir de l’entête du fichier C pour une structure donnée.

Je pourrai bien partir de pycparser ou pyparsing mais j’ai l’impression de prendre un sentier déjà battu…

]]>
By: Romain http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-162850 Thu, 02 Jul 2015 07:14:40 +0000 http://sametmax.com/?p=16503#comment-162850 Effectivement, ça peut faire le taf… si on ajoute https://pypi.python.org/pypi/asn1ate/0.5 avec parce que se taper une grammaire asn.1 à la main n’est pas un sort enviable !

J’y penserai la prochaine fois que je devrai décoder des fichiers TAP :D

]]>
By: Sam http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-162691 Mon, 29 Jun 2015 18:10:33 +0000 http://sametmax.com/?p=16503#comment-162691 https://pypi.python.org/pypi/pyasn1 :)

]]>
By: Romain http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-162685 Mon, 29 Jun 2015 15:56:20 +0000 http://sametmax.com/?p=16503#comment-162685 C’est vrai que c’est un module assez génial et en même temps c’est dommage que la description du format soit si cryptique (quoique ce ne doit pas tellement pire que des regexes).

À quand un article sur du décodage asn1 en python :-) ?

]]>
By: kontre http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-162673 Mon, 29 Jun 2015 12:05:37 +0000 http://sametmax.com/?p=16503#comment-162673 @YCL1 Le problème de ctypes c’est qu’il n’y a aucun garde-fou, quand ça merde ça segfault python lui-même (ce qui a peu de chance d’arriver avec des uint, certes). Au moins struct est safe. De plus ton exemple se fait assez facilement avec struct.

]]>
By: Sam http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-162609 Sat, 27 Jun 2015 06:26:11 +0000 http://sametmax.com/?p=16503#comment-162609 Bien vu. Une des conneries de la PSF est leur volonté de rediriger par défaut sur la doc de la 2.7.

]]>
By: cendrieR http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-162604 Sat, 27 Jun 2015 04:26:15 +0000 http://sametmax.com/?p=16503#comment-162604 Merci pour l’article !

Petite question : le lien vers la doc pointe toujours sur python 2.7. Tu ne voulais pas encourager le passage en python 3 ?

]]>
By: YCL1 http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-162592 Fri, 26 Jun 2015 23:26:24 +0000 http://sametmax.com/?p=16503#comment-162592 Argh le commentaire a tout modifié..

http://pastebin.com/G7FjUJLh

]]>
By: YCL1 http://sametmax.com/lire-un-format-binaire-en-python-avec-struct/#comment-162590 Fri, 26 Jun 2015 23:18:43 +0000 http://sametmax.com/?p=16503#comment-162590 struct est pratique pour convertir rapidement des éléments de même taille, regrouper des blocs pour en calculer le checksum par exemple.

Mais c’est beaucoup moins aisé quand il s’agit d’extraire des éléments de taille variables, de structurer des éléments.

Les structures ctypes sont beaucoup plus efficaces pour décoder/décommuter des paquets binaires.

Une petite démo :


import ctypes
 
class Header_Decoder(ctypes.BigEndianStructure): # {
    _pack_ = 1
    _fields_ = [
        ('protocol_id', ctypes.c_uint8, 8),      # 1 byte:  byte 1,      bits 00-07
        ('segmentation', ctypes.c_uint8, 3),     # 3 bits:  byte 2,      bits 08-10
        ('transaction_type', ctypes.c_uint8, 5), # 5 bits:  byte 2,      bits 11-15
        ('packet_length', ctypes.c_uint32),      # 4 bytes: bytes 3-6,   bits 16-47
        ('checksum', ctypes.c_uint16),           # 2 bytes: bytes 7-8,   bits 48-63
    ]
# } Header_Decoder
 
HEADER_LENGHT_BYTES = ctypes.sizeof(Header_Decoder)
 
packet = b'\xFF\x10\x00\x00\x00\x0C\x00\xE3\x48\x65\x79\x21'
 
header = Header_Decoder.from_buffer_copy(packet[0 : 0 + HEADER_LENGHT_BYTES])
 
print("Protocol ID:", header.protocol_id)
print("Segmentation:", header.segmentation)
print("Transaction type:", header.transaction_type)
print("Checksum:", header.checksum)
print("Data:", packet[HEADER_LENGHT_BYTES : header.packet_length].decode('ascii'))

]]>