2015-05-22 81 views
6

Sto cercando di rendere il mio progetto compatibile con python2.7 e 3 e python 3 ha il metodo integrato int.from_bytes. Esiste l'equivalente in Python 2.7 o meglio quale sarebbe il modo migliore per rendere compatibili questo codice 2.7 e 3?python 2.7 equivalente del metodo incorporato int.from_bytes

>>> int.from_bytes(b"f483", byteorder="big") 
1714698291 
+0

Se cerchi specificamente una soluzione per versioni incrociate, dovresti chiarire questo punto nel titolo. –

risposta

14

Si può trattare come una codifica (Python 2 specifica):

>>> int('f483'.encode('hex'), 16) 
1714698291 

O in Python 2 e Python 3:

>>> int(codecs.encode(b'f483', 'hex'), 16) 
1714698291 

Il vantaggio è la stringa non è limitata ad una specifica dimensione di assunzione. Lo svantaggio è che non è firmato.

+0

hah Mi piace questa soluzione ... molto ... quella che non avrei mai pensato :) ha il vantaggio di non dover sapere nulla sull'input –

+0

Il tuo è meglio perché dovrebbe funzionare in Python 2 e 3. Grazie allo – dawg

+0

se usi codecs.encode anche il tuo dovrebbe essere –

5
struct.unpack(">i","f483")[0] 

forse?

> significa big-endian e i mezzi segno a 32 bit int

vedi anche: https://docs.python.org/2/library/struct.html

+0

questo dovrebbe funzionare in python2 e 3 ... –

+1

Dovrebbe essere 'struct.unpack ("> i "," f483 ") [0]'. Vedi [qui] (http://repl.it/pIt). – mbomb007

+0

non funzionerà per qualcosa di più grande di int32, naturalmente. qualche suggerimento? –

2

Utilizza il modulo struct per decomprimere i vostri byte in numeri interi.

import struct 
>>> struct.unpack("<L", "y\xcc\xa6\xbb")[0] 
3148270713L 
+0

che li decomprime in byte ... li vuole tutti come 1 intero 32 bit ... forse più grande ... ma hai ragione che stuct è il modulo da usare :) –

+1

Non mi rendevo conto che aveva bisogno del reale valori interi, ma sì, corretto. – SanketDG