unir strings str float convertir concatenate concatenar como caracteres and python python-3.x serial-port type-conversion byte

strings - Python 3-al convertir de ints a ''bytes'' y luego concatenarlos(para transmisión en serie)



unir caracteres python (1)

Aquí confundes la sintaxis literal de Python byte; no es necesario generar la sintaxis literal, solo el valor del byte; el tipo bytes() acepta una secuencia de enteros :

>>> bytes([255]) b''/xff''

Aplicado a tu código:

SET_BG_COLOR = b''/xAA/x03/x03'' for r in range(0,255): red = bytes([r]) blue = bytes([255 - r]) ser.write(SET_BG_COLOR + blue + b''/x00'' + red + b''/xC3'') #BGR format

o, aún más simple:

SET_BG_COLOR = [0xAA, 0x03, 0x03] for r in range(0,255): ser.write(bytes(SET_BG_COLOR + [r, 0x00, 255 - r, 0xC3])) #BGR format

usando la notación de entero hexadecimal literal.

Demo para r = 10 :

>>> SET_BG_COLOR = [0xAA, 0x03, 0x03] >>> r = 10 >>> bytes(SET_BG_COLOR + [r, 0x00, 255 - r, 0xC3]) b''/xaa/x03/x03/n/x00/xf5/xc3''

La función hex() genera 4 caracteres por byte; comenzando con un literal 0x seguido de la representación hexadecimal del número entero. Codificado para UTF8 que todavía tiene 4 bytes, b''/x30/x78/x30/x31'' para el valor entero 10 , por ejemplo, frente a b''/x10'' para el byte real que usted quería.

Después de una búsqueda infructuosa ... Estoy teniendo un problema muy específico para entender la forma en que se manejan los "bytes" y el contenido hexadecimal en Python 3.2. SÉ que no entiendo bien, pero no puedo encontrar el camino correcto.

Mi objetivo final es usar el módulo de serie de python para transmitir una secuencia de bytes. Algunos bytes son estáticos y no cambiarán. Se supone que otros varían de 0 a 255 en valor. Todos estos deben ser comprimidos y transmitidos a la vez. (Estas son instrucciones para una pantalla programable. El código contiene instrucciones fijas para establecer el color BG, seguido de un byte para los valores R, G y B. Estoy tratando de recorrer las intensidades de color en un ciclo para probar, pero más tarde Quiero poder hacer esto para funciones prácticas en la pantalla).

Una transmisión estática completa, probada y funcionando correctamente, podría ser la siguiente:

ser.write(b''/xAA/x11/x05/x00/x00/x00/xc3'') #this works great

Del mismo modo, puedo juntarlos, es decir:

ser.write(b''/xAA/x11/x05'' + b''/x00/x00/x00/xc3'') #also works great

Ahora bien, si quiero tomar uno de esos tres bytes de valor cero y reemplazarlo con una variable, todo va en forma de pera. Después de mucha experimentación, terminé con algo que supuestamente convertía la variable entera de un bucle For en un tipo compatible con la concatenación a la serie de bytes anterior:

SET_BG_COLOR = b''/xAA/x03/x03'' for r in range(0,255): red = hex(r).encode(''utf-8'') blue = hex(255-r).encode(''utf-8'') ser.write(SET_BG_COLOR + blue + b''/x00'' + red + b''/xC3'') #BGR format

El código hexadecimal (entero) .encode (''utf-8'') fue el único método hasta ahora que no arrojó un error acerca de no ser capaz de concatenar a las otras cosas que estoy tratando de eliminar de la conexión serial. Pero no funciona, y al mirar los resultados:

>>> x = b''/05'' >>> x b''/x05'' >>> y = hex(5).encode(''utf-8'') >>> y b''0x5'' >>> type(x) <class ''bytes''> >>> type(y) <class ''bytes''> >>> x + y b''/x050x5'' #(this is what I get) >>> z = b''/05'' >>> x + z b''/x05/x05'' #(this is what I want) >>>

Parece que, aunque me permite concatenar ... es una representación binaria de datos de cadena, o algo así. Entonces, ¿me dejaré concatenar pero no son verdaderos valores hexadecimales? ¿He perdido una manera obvia y obvia de ir de x = 255 a x = b ''/ FF''? ¿O todo mi enfoque es el camino equivocado para hacer esto? -_- gracias por tu tiempo.