2009-12-11 63 views
15

Estoy leyendo en una matriz/lista de bytes desde el socket. Quiero que Python trate el primer byte como un "entero de 8 bits sin signo". ¿Cómo es posible obtener su valor entero como un entero sin signo de 8 bits?Convertir byte de Python en "entero de 8 bits sin signo"

+1

Si está dispuesto a tomar una dependencia de 'numpy', algunas de sus funciones toman un' dtype' arg, que puede establecer en 'numpy.uint8'. Ejemplo: 'bytestream = numpy.fromfile (infile, dtype = numpy.uint8)' – CrazyPyro

Respuesta

21

Utilice el módulo struct.

import struct 
value = struct.unpack('B', data[0])[0] 

Tenga en cuenta que desempaquetar siempre devuelve una tupla, incluso si sólo está desempaquetar un artículo.

Además, eche un vistazo a this SO question.

+0

¿puedes mostrar cómo? – bbb

+0

entonces, ¿qué se almacena en struct.unpack ('B', data [0]) [1]? – bbb

+0

datos [0] es el primer byte que recibe. unpack ("B", data [0]) trata ese byte como un entero sin signo de 8 bits (conocido como char sin signo en C) y devuelve una tupla que contiene ese entero (si hubieras pasado dos bytes para descomprimir, harías algo así como desempaquetar ("BB", datos [0: 2]) y obtener una 2-tupla de vuelta). El final [0] obtiene el primer (y único) elemento en la tupla. – codeape

7

bytes/bytearray es una secuencia de enteros. Si usted acaba de acceder a un elemento por su índice tendrá un entero:

>>> b'abc' 
b'abc' 
>>> _[0] 
97 

Por su propia definición, bytes y bytearrays contener números enteros en el range(0, 256). Entonces son "enteros de 8 bits sin signo".

+0

por ejemplo, tengo esto en mi código del lado del servidor datos = conn.recv (1000000) siempre que i entiendo i recibir bytes ... así que quiero que los datos [0] se traten como "entero de 8 bits sin signo". ¿Cómo es esto posible? – bbb

+0

Esto solo funciona en Python 3.x. Python 2.6 tiene la sintaxis literal de b'string ', pero es simplemente un alias de str, y las versiones anteriores le darán un SyntaxError. – musicinmybrain

+0

@musicinmybrain: es por eso que esta pregunta está etiquetada como 'python-3.x' supongo que – SilentGhost

7

Otra opción muy razonable y sencilla, si sólo tiene valor entero del primer byte, sería algo como lo siguiente:

value = ord(data[0]) 

Si se desea expandir todos los elementos de los datos enviados a la vez (y no son solo una matriz homogénea), o si está tratando con objetos multibyte como enteros de 32 bits, entonces necesitará usar algo como el módulo struct.

Cuestiones relacionadas