Вопрос:
Я новичок в шестнадцатеричном в общем, и у меня есть приложение, в котором мне нужно разделить шестнадцатеричное число. Например, учитывая число 0x607F, мне нужно будет вернуть высокий (0x60) или низкий (0x7F) байт.
Это может быть реализовано, но он чувствует себя немного cloogy. Есть ли более стандартный способ сделать это в python?
def byte(integer,highlow): assert highlow==’high’ or highlow==’low’ if highlow==’high’: return hex(int(bin(integer)[:-8],2)) if highlow==’low’: return hex(int(bin(integer)[-8:],2)) Лучший ответ:
Это возвращает старший байт и младший байт как кортеж:
def bytes(integer): return divmod(integer, 0x100)
Например:
>>> high, low = bytes(0x607F) >>> hex(high) ‘0x60’ >>> hex(low) ‘0x7f’
Кстати, в зависимости от того, для чего вам нужны байты, и откуда взялось целое число, могут быть гораздо лучшие способы сделать то, что вам нужно.
Ответ №1def bytes(num): return hex(num >> 8), hex(num & 0xFF) bytes(0x607F)
доходность
(‘0x60’, ‘0x7f’) Ответ №2
Чтобы добавить к Ned ответ, который является вполне правильным, struct является мощным инструментом для извлечения байтов.
>>> import struct >>> print(«0x%2x 0x%2xn» % tuple(struct.pack(‘<H’,0x4355))) 0x55 0x43
В этом примере “<” сообщает пакету интерпретации ввода как малознакомого, и “H” говорит, что ожидает 2-байтовое число. Struct создает объект байтов (на Python 3), который затем может быть преобразован в кортеж, чтобы удовлетворить параметры форматирования строки для% x, чтобы распечатать шестнадцатеричный.
Python 2.7 немного более громоздкий, только потому, что struct.pack помещает информацию в строку, которая должна быть разделена на ее символы:
>>> print(«0x%2x 0x%2xn» % tuple([ ord(x) for x in struct.pack(‘<H’,0x4355)])) 0x55 0x43
Если вы действительно делаете что-то столь же простое, как этот пример, это, вероятно, слишком велико. Если вы манипулируете большим количеством значений или различной длиной чисел, например, из регистров, наблюдаемых с микроконтроллера, или обмениваясь данными с C или C++, рассмотрите возможность использования struct, чтобы упростить споры с байтами.