Niespójne zachowanie int.to_bytes ()

Nov 29 2020

Kiedy piszę:

expint = 34614  
expint = expint.to_bytes(2,'big')

Otrzymuję wartość expint = b '\ x876' zamiast b '\ x87 \ x36' (brakuje 3 i format wydaje się nieprawidłowy). Jednak kiedy spróbowałem tego samego z expint = 65418, otrzymałem poprawny wynik, b '\ xff \ x8a'. Czy to może być błąd w tłumaczu lub innych narzędziach, których używam? Używam języka Python 3,7 w programie Visual Studio 2017.

Odpowiedzi

2 KarlKnechtel Nov 29 2020 at 20:32

To nie ma nic int.to_bytes()wspólnego z samym bytestypem.

Otrzymuję wartość expint = b '\ x876' zamiast b '\ x87 \ x36'

Ten zarzut nie ma żadnego sensu, bo b'\x876'i b'\x87\x36' to samo :

>>> b'\x87\x36'
b'\x876'
>>> b'\x87\x36' == b'\x876'
True

A bytesreprezentacja obiektu jest nie po prostu nora hex. Gramatyka łańcuchów bajtowych pozwala na wiele innych opcji, ze względów historycznych (np. Ponieważ w wersji 2.x udawaliśmy, że mogą one reprezentować tekst). Reprezentacja kanoniczna (tj. Ta utworzona przez Pythona, kiedy tworzysz printinstancję) używa \xznaków ucieczki stylu tylko w ostateczności.

W ASCII bajt z wartością 0x36jest mapowany na symbol 6. (Ponownie: udawaliśmy, że możemy przedstawiać tekst w ten sposób. Jeśli mamy do czynienia tylko z językiem angielskim oraz niewielkim wyborem języków europejskich i możemy wybrać, z którym językiem europejskim mamy do czynienia w danym momencie, możemy posortować - to też uszło na sucho.)