Что такое \ t и \ r в байтовом представлении? - PullRequest
0 голосов
/ 25 января 2020
import sys
for i in range(30):
#     a = int(str(i),base = 16).to_bytes(4,sys.byteorder)
    a = i.to_bytes(4,sys.byteorder)
    print(a)

Здесь sys.byteorder кажется 'маленьким' . Вывод вышеприведенного кода:

b'\x00\x00\x00\x00'
b'\x01\x00\x00\x00'
b'\x02\x00\x00\x00'
b'\x03\x00\x00\x00'
b'\x04\x00\x00\x00'
b'\x05\x00\x00\x00'
b'\x06\x00\x00\x00'
b'\x07\x00\x00\x00'
b'\x08\x00\x00\x00'
b'\t\x00\x00\x00'
b'\n\x00\x00\x00'
b'\x0b\x00\x00\x00'
b'\x0c\x00\x00\x00'
b'\r\x00\x00\x00'
b'\x0e\x00\x00\x00'
b'\x0f\x00\x00\x00'
b'\x10\x00\x00\x00'
b'\x11\x00\x00\x00'
b'\x12\x00\x00\x00'
b'\x13\x00\x00\x00'
b'\x14\x00\x00\x00'
b'\x15\x00\x00\x00'
b'\x16\x00\x00\x00'
b'\x17\x00\x00\x00'
b'\x18\x00\x00\x00'
b'\x19\x00\x00\x00'
b'\x1a\x00\x00\x00'
b'\x1b\x00\x00\x00'
b'\x1c\x00\x00\x00'
b'\x1d\x00\x00\x00'

Заметьте, что целое число 9 здесь неприятно записано как b'\t\x00\x00\x00' вместе со схожими странностями, такими как 0xa и 0xd.

Это аберрация или мне не хватает этих обозначений? Моя Python версия 3.8.2.

Ответы [ 2 ]

0 голосов
/ 26 января 2020

Я думаю, что отчасти проблема в том, что вы используете байт в двух смыслах. Это может означать тип данных и представление. И вы ожидаете, что переменная типа данных byte будет иметь конкретное представление байтов.

Давайте начнем с рассмотрения этих эквивалентностей:

>>> b"\x09\x0a\x0b\x0c\x0d\x0e" == b"\t\n\x0b\x0c\r\x0e" == bytes([9,10,11,12,13,14])
True

Как видите, даже если представления этих 6 байтов в Python коде отличаются, data - то же самое. Средний является представлением Python по умолчанию, если вы просто вызываете print() для нескольких байтов.

Если вам важно, чтобы целые значения от 0 до 29 отображались в виде 2 шестнадцатеричных цифр, то все, что вам нужно сделать, это отформатировать целые числа в 2 шестнадцатеричные цифры, например:

for i in range(30):
    print (f"{i:02x}")

00
01
02
03
...
1b
1c
1d

Если вам нужен ведущий 0x, поместите его в строку f перед открывающей скобкой.

На самом деле вы не можете преобразовать целочисленное значение в байт типа данных (что, я думаю, вы пытались сделать с вызовом to_bytes()), поскольку Python не имеет тип байта , to_bytes() возвращает bytes, представляющий собой список целых чисел в диапазоне 0–255, а его экранное представление по умолчанию - строка байтов.

Форматирование влияет только на то, как значения отображаются на экране. Если вы хотите вернуть шестнадцатеричное представление в переменную (скажем, потому что вы пишете шестнадцатеричный редактор и вам нужно манипулировать внешним видом в вашем собственном коде), то, как говорит @ Harmon758, используйте функцию hex():

for i in range(30):
    h = hex(i)
    print (h)

Это дает тот же вывод, что и print (f"0x{i:02x}"), но это не то же самое, потому что h не является целым числом, это строка длины 4. Только экранное представление одинаково. Если вы хотите, чтобы строка выглядела несколько иначе (например, заглавная буква X или 4 начальных нуля), вы можете использовать f -строку вместо вызова hex():

>>> i = 29
>>> h = f"0X{i:04x}"
>>> h
'0X001d'
>>> h = f"0X{i:04X}"
>>> h
'0X001D'
0 голосов
/ 25 января 2020

Это escape-последовательности.
\t представляет горизонтальную вкладку ASCII (TAB), а \r представляет возврат каретки ASCII (CR).

См. Python документация строковых и байтовых литералов .

...