2016-09-21 2 views
2

У меня проблема с преобразованием int в байты в Python.Python 3.2+ преобразование int в байты

Это работает -

>>> (1024).to_bytes(2, 'big') 
b'\x04\x00' 

Однако это не работает, как я ожидал бы -

>>> (33).to_bytes(2, 'big') 
b'\x00!' 

Что я не понимая?

+4

Обратите внимание на восклицательный знак во втором примере. Посмотрите на его значение ASCII. –

+0

Вы можете заставить его отображать все байты в шестнадцатеричном формате с символом «.» .join («\\ x {: 02}». (B) для b в (33) .to_bytes (2, «большой»)). – martineau

ответ

5

десятичное значение 33 карты в характер ! по стандарту ASCII, так что интерпретатор может показать его без помощи экранирующих коды:

>>> b'\x21' * 3 
b'!!!' 

При печати объекта байт, питон рассматривает его как последовательность символов (каждый символ сохраняется как байт, каждый байт обычно использует память из 8 бит, которая отображает в 2 значения шестнадцатеричных цифр, например 0x21 => 0b 0010 0001 => 33), поэтому значения с соответствующими печатными символами ASCII показаны как их символы ASCII, а остальные представлены шестнадцатеричными al (в формате \xDD).

1

Вы не понимаете, что ! является символом ASCII 33, что эквивалентно \x21. Это bytestring - это именно то, что вы попросили; он просто не отображается так, как вы ожидали.

3

Согласно документации ->https://docs.python.org/3.3/library/stdtypes.html

>>> (1024).to_bytes(2, byteorder='big') 
b'\x04\x00' 
>>> (1024).to_bytes(10, byteorder='big') 
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' 
>>> (-1024).to_bytes(10, byteorder='big', signed=True) 
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00' 
>>> x = 1000 
>>> x.to_bytes((x.bit_length() // 8) + 1, byteorder='little') 
b'\xe8\x03'