Niespójne zachowanie int.to_bytes ()
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
To nie ma nic int.to_bytes()
wspólnego z samym bytes
typem.
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 bytes
reprezentacja 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 print
instancję) używa \x
znaków ucieczki stylu tylko w ostateczności.
W ASCII bajt z wartością 0x36
jest 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.)