Penso che la soluzione migliore è quella di essere espliciti e dire che si vuole rappresentare un numero come un byte (e not as a character):
>>> import struct
>>> struct.pack('B', 128)
>>> '\x80'
Questo rende il vostro lavoro il codice sia in Python 2 e Python 3 (in Python 3, il risultato è, come dovrebbe, un oggetto bytes). Un'alternativa, in Python 3, sarebbe quella di utilizzare il nuovo bytes([128])
per creare un singolo byte di valore 128.
Io non sono un grande fan dei chr()
soluzioni: in Python 3, producono un (carattere, non byte) stringa che deve essere encoded prima di inviarlo ovunque (file, socket, terminale, ...) - chr()
in Python 3 equivale al problema Python 2 unichr()
della domanda. La soluzione struct
ha il vantaggio di produrre correttamente un byte qualunque sia la versione di Python. Se si desidera inviare dati tramite la porta seriale con chr()
, è necessario avere il controllo sulla codifica che deve essere eseguita successivamente.Il codice potrebbe funzionare quando la codifica predefinita utilizzata da Python 3 è UTF-8 (che penso sia il caso), ma ciò è dovuto al fatto che i caratteri Unicode del punto di codice inferiore a 256 possono essere codificati come un singolo byte in UTF -8. Questo aggiunge un inutile livello di sottigliezza e complessità che non raccomando (rende il codice più difficile da capire e, se necessario, il debug).
Quindi, suggerisco vivamente di utilizzare l'approccio di cui sopra (che è stato accennato anche da Steve Barnes e Martijn Pieters): lo rende chiaro che si vuole produrre un byte (e non caratteri). Non ti sorprenderà nemmeno se esegui il tuo codice con Python 3, e rende il tuo intento più chiaro e più ovvio.
python2 o python3? (indovinando Python2, ma fa la differenza) Sei sicuro che 'unichr' è la chiamata in crash? Come stai facendo l'effettivo invio dei dati restituiti da unichr? –
'unichr()' non esiste in Python 3, quindi questo è Python 2. 'unichr()' è chiamato 'chr()' in Python 3 (conversione in un carattere Unicode). – EOL