Je suis chargé de lire un fichier binaire mal formaté et de prendre en compte les variables. Bien que je doive le faire en C++ (ROOT, spécifiquement), j'ai décidé de le faire en python parce que python a du sens pour moi, mais mon plan est de le faire fonctionner en python et ensuite de réécrire en C++, l'utilisation de modules python faciles à utiliser ne m'amènera pas trop loin plus tard.Convertir des informations binaires en un type de données normal sans modules externes en python
En fait, je fais ceci:
In [5]: some_value
Out[5]: '\x00I'
In [6]: ''.join([str(ord(i)) for i in some_value])
Out[6]: '073'
In [7]: int(''.join([str(ord(i)) for i in some_value]))
Out[7]: 73
Et je sais qu'il a être une meilleure façon. Qu'est-ce que tu penses?
EDIT:
Un peu d'informations sur le format binaire.
alt text http://grab.by/3njm alt text http://grab.by/3njv alt text http://grab.by/3nkL
C'est le test endian J'utilise:
# Read a uint32 for endianess
endian_test = rq1_file.read(uint32)
if endian_test == '\x04\x03\x02\x01':
print "Endian test: \\x04\\x03\\x02\\x01"
swapbits = True
elif endian_test == '\x01\x02\x03\x04':
print "Endian test: \\x01\\x02\\x03\\x04"
swapbits = False
Merci pour la réponse John. Un test endian est fait et si besoin est, la valeur est octet permutée avant cet algorithme. Je ne pense pas qu'il y ait des ints négatifs, mais s'il y en a, je ne connais pas leur représentation. Il y a des nombres à virgule flottante. ROOT est un framework CERN utilisé pour l'analyse en High Energy Physics, écrit en C++. – physicsmichael
J'analyse des données provenant d'un système d'acquisition de données distant, donc je ne peux pas vous en dire beaucoup sur le format ou l'ordinateur, ce qui fait partie du défi. Le lecteur que je fais mélange un peu de connaissance de ce que contient la sortie binaire, mais doit être capable de gérer une structure binaire variable en même temps. Fondamentalement, cette chose est une douleur et je suis sous qualifié. – physicsmichael
@ vgm64: S'il vous plaît expliquer "un test endian est fait et si besoin [être]". Est fait par qui/quoi? Le DAQ met-il un marqueur d'ordre d'octets dans le (s) fichier (s)? Si vous testez l'ordre des octets de l'ordinateur de conversion, ne le faites pas; c'est une complication inutile. S'il vous plaît répondez aux questions sur l'endianisme littéralement. Nous devons savoir ce que vous savez, pas ce que vous faites. Veuillez répondre à la question "must-use-C++". Est-ce un travail ponctuel sur une collection de données? Si oui, ne pouvez-vous pas utiliser Python pour convertir les fichiers en une meilleure structure à lire par le logiciel C++ supposé existant? –