Perilaku int.to_bytes () tidak konsisten

Nov 29 2020

Ketika saya menulis:

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

Saya mendapatkan nilai expint = b '\ x876' dan bukan b '\ x87 \ x36' (angka 3 hilang dan formatnya salah). Namun ketika saya mencoba hal yang sama dengan expint = 65418 saya mendapatkan hasil yang benar, b '\ xff \ x8a'. Mungkinkah ini bug di interpreter atau alat lain yang saya gunakan? Saya menggunakan Python 3.7 di Visual Studio 2017.

Jawaban

2 KarlKnechtel Nov 29 2020 at 20:32

Ini tidak ada hubungannya dengan int.to_bytes(), dan semuanya berkaitan dengan bytestipe itu sendiri.

Saya mendapatkan nilai expint = b '\ x876' bukan b '\ x87 \ x36'

Keluhan ini tidak masuk akal, karena b'\x876'dan b'\x87\x36' adalah hal yang sama :

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

Sebuah bytesrepresentasi objek adalah tidak hanya hex dump. Tata bahasa string byte memungkinkan banyak opsi lain, untuk alasan historis (yaitu: karena dalam 2.x kami biasa berpura-pura bahwa mereka dapat mewakili teks). Representasi kanonik (yaitu yang diproduksi oleh Python saat Anda printsebuah instance) hanya menggunakan \xpelolosan gaya sebagai pilihan terakhir.

Dalam ASCII, byte dengan nilai 0x36dipetakan ke simbol 6. (Sekali lagi: kami biasanya berpura-pura dapat merepresentasikan teks dengan cara ini. Dan jika kami hanya harus berurusan dengan bahasa Inggris ditambah sedikit pilihan bahasa Eropa, dan dapat memilih bahasa Eropa mana yang kami gunakan pada waktu tertentu, kami dapat mengurutkan -dari lolos, juga.)