Domanda

Sto aprendo un file binario in questo modo:

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

e leggere in righe di un elenco.Ogni riga assomiglia un po' a:

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

Ho difficoltà a manipolare questi dati.Se provo a stampare ogni riga, Python si blocca ed emette dei segnali acustici (penso che ci sia un codice bip binario da qualche parte).Come posso utilizzare questi dati in modo sicuro?Come posso convertire ogni numero esadecimale in decimale?

È stato utile?

Soluzione

Per stamparlo, si può fare qualcosa di simile:

print repr(data)

Per il tutto come esadecimale:

print data.encode('hex')

Per il valore decimale di ogni byte:

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

Per decomprimere interi binari, ecc dai dati come se fossero originariamente proveniva da una struct C-stile, sguardo al struct modulo.

Altri suggerimenti

\xhh è il carattere con valore esadecimale hh . Altri personaggi come . e `~' sono caratteri normali.

iterazione su una stringa ti dà i caratteri in esso, una alla volta.

ord(c) restituirà un numero intero che rappresenta il carattere. esempio, ord('A') == 65.

Questo stamperà i numeri decimali per ogni personaggio:

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)

Come theatrus menzionato, ord e hex potrebbe aiutarti. Se si vuole cercare di interpretare un qualche tipo di dati binari strutturati nel file, il struct modulo potrebbe essere utile.

I dati binari sono raramente divisi in "linee" separate da " ".Se lo è, avrà un meccanismo di escape implicito o esplicito per distinguere tra " " come terminatore di riga e " " come parte dei dati.Leggere alla cieca un file come le linee senza conoscere il meccanismo di fuga è inutile.

Per rispondere alle tue preoccupazioni specifiche:

'\x07' è il carattere ASCII BEL, originariamente utilizzato per suonare il campanello su una telescrivente.

Puoi ottenere il valore intero di un byte 'b' facendo ord(b).

TUTTAVIA, per elaborare correttamente i dati binari, è necessario sapere qual è il layout.Puoi avere numeri interi con segno e senza segno (di dimensioni 1, 2, 4, 8 byte), numeri in virgola mobile, numeri decimali di lunghezza variabile, stringhe di lunghezza fissa, stringhe di lunghezza variabile, ecc. Ecc.Un'ulteriore complicazione deriva dal fatto che i dati siano registrati in modo bigendiano o in modo littleendiano.Una volta che sai tutto quanto sopra (o hai ipotesi ben informate), il Modulo struttura Python dovrebbe poter essere utilizzato per tutta o la maggior parte del trattamento;IL modulo ctypes può anche essere utile.

Il formato dei dati ha un nome?Se è così, diccelo;potremmo essere in grado di indicarti codice o documenti.

Chiedi "Come posso usare questi dati in sicurezza?" Il che pone la domanda:Per cosa vuoi usarlo?Quali manipolazioni vuoi fare?

Si sta tentando di stampare i dati convertiti in caratteri ASCII, che non funzionerà.

È possibile utilizzare in modo sicuro qualsiasi byte dei dati. Se si desidera stampare come un esadecimale, guarda le funzioni ord e hex /

Si sta utilizzando read() o readline()? Si deve usare read(n) leggere n byte; readline() leggerà fino a raggiungere una nuova riga, che il file binario potrebbe non avere.

In entrambi i casi, però, si ritorna una stringa di byte, che può essere caratteri stampabili o non stampabili, e probabilmente non è molto utile.

Quello che vuoi è ord(), che converte una stringa di un byte nel valore intero corrispondente. read() dal file un byte alla volta e chiamata ord() sul risultato, o scorrere l'intera stringa.

Se si è disposti a utilizzare NumPy e bitstream , si può fare

>>> 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top