PDA

Visualizza la versione completa : [PYTHON] Ottenere i byte che formano un intero


dnlplm
18-05-2007, 10:44
Salve a tutti,

ho la necessità di ottenere i byte che formano un numero. Ad esempio, supponendo di avere

i = 3000

vorrei sapere se esiste un metodo o una tecnica che mi restituisca i singoli byte che formano il numero (0x0B e 0xB8). Come potete immaginare è un problema che nasce da architetture con differenti endianness.

Grazie in anticipo

billiejoex
18-05-2007, 16:56
Non mi è chiaro che intendi con "bytes che formano un intero".
In che senso?

dnlplm
18-05-2007, 17:01
Ad esempio, se vieni dal C sai che un int in certe architetture è formato da 4 byte, quindi in memoria avrà una rappresentazione del tipo (sto scrivendo numeri a caso)

0x32 0x10 0xA3 0x18

in Python mi sembra di capire che un intero non è formato da un numero fisso di byte. Dunque dato un numero a me servirebbe trovare il valore dei singoli byte (quindi i 4 di sopra). In realtà ho trovato un modo usando struct.pack e unpack, ma mi sembra un po' macchinoso, quindi magari mi sai suggerire qualcosa di meglio.

andbin
18-05-2007, 17:06
Originariamente inviato da dnlplm
Salve a tutti,

ho la necessità di ottenere i byte che formano un numero. Ad esempio, supponendo di avere

i = 3000

vorrei sapere se esiste un metodo o una tecnica che mi restituisca i singoli byte che formano il numero (0x0B e 0xB8). Come potete immaginare è un problema che nasce da architetture con differenti endianness.Quello che dirò ora vale molto in generale e quindi non solo relativo a Python (che ammetto di conoscere davvero poco).
Se vuoi ottenere i singoli byte la maniera più semplice è quella di fare giusto un paio di operazioni per estrarre i valori. Il byte meno significativo lo ottieni facendo una AND del valore con 255 (0xff), il byte appena più significativo lo ottieni facendo uno shift a destra di 8 bit e quindi una AND con 255. E così via ....

Se ci siano funzioni già fatte in Python per fare ciò ... non lo so.

andbin
18-05-2007, 17:11
Originariamente inviato da dnlplm
in Python mi sembra di capire che un intero non è formato da un numero fisso di byte. Dunque dato un numero a me servirebbe trovare il valore dei singoli byte (quindi i 4 di sopra). In realtà ho trovato un modo usando struct.pack e unpack, ma mi sembra un po' macchinoso, quindi magari mi sai suggerire qualcosa di meglio. Forse è meglio se leggi <qui> (Ad esempio, se vieni dal C sai che un int in certe architetture è formato da 4 byte, quindi in memoria avrà una rappresentazione del tipo (sto scrivendo numeri a caso)) sul manuale ufficiale.

dnlplm
18-05-2007, 17:35
Originariamente inviato da andbin
Forse è meglio se leggi <qui> (Ad esempio, se vieni dal C sai che un int in certe architetture è formato da 4 byte, quindi in memoria avrà una rappresentazione del tipo (sto scrivendo numeri a caso)) sul manuale ufficiale.

Non so perchè, ma non mi riesce ad aprire il link. In ogni caso il metodo che hai suggerito tu in C funzionerebbe benissimo, ma in Python mi sembra di capire che non si ha tutta questa flessibilità sino al singolo byte. In sostanza io vorrei arrivare ad avere degli interi che singolarmente rappresentano i byte in cui è composto il numero, quindi supponiamo sempre di avere 3000

0x0B -> 11

0xB8 -> 184

ho risolto in questo modo:

def getByteNumber(self, length):
temp = struct.pack('!h', length)
byteList = [firstLength, secondLength] = struct.unpack('BB', temp)
return list(byteList)

In questo modo ho una lista avente come elementi i byte che interessano a me. Ripeto che però mi sembra un po' macchinoso, ho cercato anche in diversi manuali, ma non ho trovato niente

billiejoex
18-05-2007, 19:29
Non so perchè, ma non mi riesce ad aprire il link. In ogni caso il metodo che hai suggerito tu in C funzionerebbe benissimo, ma in Python mi sembra di capire che non si ha tutta questa flessibilità sino al singolo byte. In sostanza io vorrei arrivare ad avere degli interi che singolarmente rappresentano i byte in cui è composto il numero, quindi supponiamo sempre di avere 3000

0x0B -> 11

0xB8 -> 184

Questa è una conversione da intero a stringa esadecimale.
La puoi effettuare tramite il builtin hex():


>>> hex(184)
'0xb8'
>>> hex(11)
'0xb'

Loading