Почему при итерации через bytes получается другое значение, чем при вычислении шестнадцатеричного числа вручную?

Не могу понять, почему значения 62 и 95 выводятся в вашем коде при итерации. Объясните, откуда они берутся и как он работает. 
  • 14 сентября 2023 г. 5:56
Ответы на вопрос 2
При итерации через bytes мы получаем значения в десятичной системе счисления, которые соответствуют кодам ASCII символов. 

В ASCII таблице символ с кодом 62 (0x3e в шестнадцатеричной системе) соответствует символу ">", а символ с кодом 95 (0x5f в шестнадцатеричной системе) соответствует символу "_".

Вычисление шестнадцатеричного числа вручную с использованием модуля 16 и деления на 16 будет давать нам остаток от деления (цифры от 0 до 15), а не значение кода ASCII символов. Таким образом, при вычислении шестнадцатеричного числа вручную мы не получаем значения символов ">", "_", а получаем значения цифр в шестнадцатеричном представлении числа.

Итерирование через bytes используется для получения байтового представления строки (или других последовательностей байтов), тогда как вычисление шестнадцатеричного числа вручную выполняет математическую операцию над числами.
Возможно, вы пропустили символы ">" и "_", которые также являются частью вашей строки "bytes". Коды этих символов (62 и 95) в десятичной системе вызывают у вас вопросы.

Для вывода кодов символов в формате шестнадцатеричной записи можно воспользоваться следующим кодом:

data = b'>\x02\xfe\xbf_\xec\xe6\xee\x00R'
for i in range(len(data)):
    hex_repr = '\\x{:02x}'.format(data[i])
    print(i, data[i], f"({hex_repr})")

# 0 62 (\x3e)
# 1 2 (\x02)
# 2 254 (\xfe)
# 3 191 (\xbf)
# 4 95 (\x5f)
# 5 236 (\xec)
# 6 230 (\xe6)
# 7 238 (\xee)
# 8 0 (\x00)
# 9 82 (\x52)
Похожие вопросы