Question

J'ouvre un fichier binaire comme ceci:

file = open("test/test.x", 'rb')

et la lecture dans les lignes à une liste. Chaque ligne ressemble un peu à:

'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'

Je suis un moment difficile manipuler ces données. Si je tente et imprimer chaque ligne, se fige python et émet des bruits biper (je pense qu'il ya un code sonore binaire là quelque part). Comment puis-je sur l'utilisation de ces données en toute sécurité? Comment puis-je convertir chaque nombre hexadécimal en décimal?

Était-ce utile?

La solution

Pour imprimer, vous pouvez faire quelque chose comme ceci:

print repr(data)

Pour la chose comme hex:

print data.encode('hex')

Pour la valeur décimale de chaque octet:

print ' '.join([str(ord(a)) for a in data])

Pour déballer des entiers binaires, etc. à partir des données comme si elles venaient à l'origine d'un struct style C, regardez la struct module.

Autres conseils

\xhh est le caractère avec la valeur hexadécimale hh. D'autres personnages tels que . et `~ » sont des caractères normaux.

Itération sur une chaîne vous donne les caractères en elle, un à la fois.

ord(c) renvoie un nombre entier représentant le caractère. Par exemple, ord('A') == 65.

Cela affichera le nombre de décimales pour chaque caractère:

s = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
print ' '.join(str(ord(c)) for c in s)

Comme mentionné theatrus, ord et hexagonale pourrait vous aider. Si vous voulez essayer d'interpréter une sorte de données binaires structurées dans le fichier, le struct Module peut être utile.

Les données binaires est rarement divisée en « lignes » séparés par « \ n ». Le cas échéant, il disposera d'un mécanisme d'évasion implicite ou explicite de faire la distinction entre « \ n » en tant que terminaison de ligne et « \ n » dans le cadre des données. La lecture d'un tel fichier sous forme de lignes aveuglément sans connaissance du mécanisme d'échappement est inutile.

Pour répondre à vos préoccupations spécifiques:

« \ x07 » est le caractère BEL ASCII, qui était à l'origine pour sonner la cloche sur un téléscripteur.

Vous pouvez obtenir la valeur entière d'un octet « b » en faisant ord(b).

Cependant, pour traiter les données binaires correctement, vous devez savoir ce que la mise en page est . Vous pouvez avoir signé et entiers non signés (de tailles 1, 2, 4, 8 octets), nombres à virgule flottante, nombres décimaux de longueurs différentes, des chaînes de longueur fixe, chaînes de longueur variable, etc., etc. complication supplémentaire provient de savoir si les données sont enregistrées en mode bigEndian ou mode littleEndian. Une fois que vous savez tous ce qui précède (ou qui ont de très bonnes suppositions éclairées), Python Module struct devrait pouvoir être utilisé pour tout ou la majeure partie de votre traitement; le module ctypes peut également être utile.

Est-ce que le format de données ont un nom? Si oui, dites-nous; nous pouvons être en mesure de vous indiquer le code ou docs.

Vous demandez « Comment puis-je sur l'utilisation de ces données en toute sécurité? » Ce qui pose la question suivante: Que voulez-vous utiliser? Qu'est-ce que les manipulations voulez-vous faire?

Vous essayez d'imprimer les données converties en caractères ASCII, qui ne fonctionnera pas.

Vous pouvez utiliser en toute sécurité tout octet des données. Si vous voulez l'imprimer comme hexadécimal, regardez les fonctions ord et hex /

Utilisez-vous read() ou readline()? Vous devez utiliser read(n) pour lire n octets; readline() lira jusqu'à ce qu'elle touche un saut de ligne, que le fichier binaire peut ne pas avoir.

Dans les deux cas, cependant, vous revenez d'une chaîne d'octets, qui peut être des caractères imprimables ou non imprimables, et probablement pas très utile.

Qu'est-ce que vous voulez est ord(), qui convertit une chaîne d'un octet dans la valeur entière correspondant. read() à partir du fichier d'un octet à la fois et ord() appel sur le résultat, ou itérer à travers la totalité de la chaîne.

Si vous êtes prêt à utiliser NumPy et bitstream , vous pouvez le faire

>>> from numpy import *
>>> from bitstream import BitStream
>>> raw = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
>>> stream = BitStream(raw)
>>> stream.read(raw, uint8, len(stream) // 8)
array([190,   0, 200, 100, 248, 100,   8, 228,  46,   7, 126,   3, 158,
         7, 190,   3, 222,   7, 254,  10], dtype=uint8)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top