2013-02-23 3 views
1

Я довольно новичок в шестнадцатеричном в целом, и у меня есть приложение, которое требует от меня разделить шестнадцатеричное число. Например, учитывая число 0x607F, мне нужно будет вернуть высокий (0x60) или низкий (0x7F) байт.Лучший способ разделить шестнадцатеричный в python?

Это может быть реализовано, но он чувствует себя немного 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)) 

ответ

11

Это возвращает старший байт и младший байт в виде кортежа:

def bytes(integer): 
    return divmod(integer, 0x100) 

Например:

>>> high, low = bytes(0x607F) 
>>> hex(high) 
'0x60' 
>>> hex(low) 
'0x7f' 

BTW, в зависимости от того, что вам нужно байты для, и где от целого числа, могут быть гораздо лучшие способы сделать то, что вам нужно.

+0

Едва только выкрикнул ответ unutbu на моей машине ... 1.8us vs 2.22us. FWIW мой код приходил на 4.97us и только вычислял только один. – Chris

4
def bytes(num): 
    return hex(num >> 8), hex(num & 0xFF) 

bytes(0x607F) 

дает

('0x60', '0x7f') 
0

Чтобы добавить ответ Неда, который является вполне корректным, struct является мощным инструментом для извлечения байтов.

>>> import struct 
>>> print("0x%2x 0x%2x\n" % tuple(struct.pack('<H',0x4355))) 
0x55 0x43 

В этом примере «<» говорит упаковать, чтобы интерпретировать ввод в little-endian, и «H», говорит ожидать ряд 2 байт. Struct создает объект байтов (на Python 3), который затем может быть преобразован в кортеж, чтобы удовлетворить параметры форматирования строки для% x, чтобы распечатать шестнадцатеричный.

Python 2.7 немного более громоздким, только потому, что struct.pack помещает данные в строку, которая должна быть split into its characters:

>>> print("0x%2x 0x%2x\n" % tuple([ ord(x) for x in struct.pack('<H',0x4355)])) 
0x55 0x43 

Если вы действительно являются делать что-то же просто, как это, например, это, вероятно, излишество. Если вы используете больше значений или разных длин чисел, например, регистры, наблюдаемые с помощью микроконтроллера, или обмен данными с C или C++, рассмотрите возможность использования struct, чтобы упростить споры с байтами.

Смежные вопросы