Bonjour,
Les chronotachygraphes des transporteurs routiers, enregistrant toutes leurs actions, génèrent des fichiers C1B. Ces fichiers sont en fait une copie de la mémoire de la carte du conducteur, donc avec des FE et une arborescence.

Je souhaite parser un de ces fichiers binaires en reproduisant cette arborescence dans un objet python, mais j'aimerais savoir quelle est la technique la plus propre. ( L'arborescence est visible à la page 138 de ce PDF )
Pour l'instant, je n'ai fait qu'une concaténation d'objets.
Le code ressemble à ça :
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
 
class C1BCard(object): #L'objet principal contenant tout les autres
	def __init__(self):
		pass
	def parse(self, fichier):
		with open(fichier, 'rb') as fichC1B:
			while 1 :
				idf = fichC1B.read(3) # l'IDF est la balise annoncant le type de FE qui va suivre.
				if not idf : break
				length = binToInt(fichC1B.read(2)) #longueur du FE après l'IDF
				if binToInt(idf[2])==1: # Dans ce cas, ce n'est pas un FE mais une signature, je ne traite pas
					Signature(str(IDF[idf[:2]]), fichC1B.read(length).encode("base64_codec"))
				else :
					self.__dict__[ IDF[idf[:2]].__name__ ] = IDF[idf[:2]]() # J'instancie l'objet correspondant au FE détecté 
					self.__dict__[ IDF[idf[:2]].__name__ ].parse(fichC1B.read(length)) # J'appelle la fonction parse() dans laquelle je balance directement l'intégralité du FE
IDF = {"\x00\x02": ICC, 
	"\x00\x05": IC,
	"\x05\x00": Tachograph,
	"\x05\x01": Application_Identification,
	"\xC1\x00": Card_Certificate,
	"\xC1\x08": CA_Certificate,
	"\x05\x09": Card_Download, 
	"\x05\x20": Identification, 
	"\x05\x0E": Card_Download, 
	"\x05\x21": Driving_Licence_Info, 
	"\x05\x02": Events_Data, 
	"\x05\x03": Faults_Data, 
	"\x05\x04": Driver_Activity_Data, 
	"\x05\x05": Vehicles_Used, 
	"\x05\x06": Places, 
	"\x05\x07": Current_Usage, 
	"\x05\x08": Control_Activity_Data,
	"\x05\x22": Specific_Conditions }
Les sous objets sont ensuite définis par :
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
class Identification(object):
	def parse(self, cont):
		## CardIdentification
		self.cardIssuingMemberState = NationNumeric[cont[0].encode("hex_codec")]
		self.cardNumber = CardNumber(cont[1:17])
		self.cardIssuingAuthorityName = Name(cont[17:53])
		self.cardIssueDate = TimeReal(cont[53:57])
		self.cardValidityBegin = TimeReal(cont[57:61])
		self.cardExpiryDate = TimeReal(cont[61:65])
		##DriverCardHolderIdentificaton
		#~cardHolderName
		self.holderSurName = Name(cont[65:101])
		self.holderFirstName = Name(cont[101:137])
		self.cardHolderBirthDate = Datef(cont[137:141])
		self.cardHolderPreferredLanguage = cont[141:143].encode("ascii")

Le principal problème est qu'il n'y a absolument aucune interaction entre les FE. Je ne peux pas accéder depuis un objet FE à une variable d'un autre objet FE à part en la faisant variable globale.

Je cherche donc une solution permettant de conserver l'arborescence ( je dois pouvoir faire LeC1B.Application_Identification.noOfEventsPerType ) tout en rendant les objets interactifs entre eux (si je me fais comprendre...). Qu'en pensez vous ?