Comportamento incoerente di int.to_bytes ()
Quando scrivo:
expint = 34614
expint = expint.to_bytes(2,'big')
Ottengo un valore di scadenza = b '\ x876' invece di b '\ x87 \ x36' (il 3 manca e il formato sembra sbagliato). Tuttavia, quando ho provato lo stesso con expint = 65418, ho ottenuto il risultato corretto, b '\ xff \ x8a'. Potrebbe essere un bug nell'interprete o in altri strumenti che sto utilizzando? Sto usando Python 3.7 in Visual Studio 2017.
Risposte
Questo non ha nulla a che fare con int.to_bytes()e tutto a che fare con il bytestipo stesso.
Ottengo un valore di scadenza = b '\ x876' invece di b '\ x87 \ x36'
Questa lamentela non ha alcun senso, perché b'\x876'e b'\x87\x36' sono la stessa cosa :
>>> b'\x87\x36'
b'\x876'
>>> b'\x87\x36' == b'\x876'
True
bytesLa rappresentazione di un oggetto non è semplicemente un dump esadecimale. La grammatica delle stringhe di byte consente molte altre opzioni, per ragioni storiche (ad esempio: perché in 2.x si fingeva che potessero rappresentare testo). La rappresentazione canonica (cioè quella prodotta da Python quando si tratta di printun'istanza) utilizza solo gli escape di \xstile come ultima risorsa.
In ASCII, il byte con valore 0x36viene mappato al simbolo 6. (Ancora: fingevamo di poter rappresentare il testo in questo modo. E se abbiamo a che fare solo con l'inglese più una piccola selezione di lingue europee e possiamo scegliere con quale lingua europea abbiamo a che fare in un dato momento, possiamo ordinare -di farla franca, anche.)