Я думаю, что отчасти проблема в том, что вы используете байт в двух смыслах. Это может означать тип данных и представление. И вы ожидаете, что переменная типа данных 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'