Преобразовать целое число в шестнадцатеричную строку с определенным форматом - PullRequest
9 голосов
/ 29 июля 2011

Я новичок в python и имею следующую проблему: мне нужно преобразовать целое число в шестнадцатеричную строку с 6 байтами.

например. 281473900746245 -> "\ xFF \ xFF \ xBF \ xDE \ x16 \ x05"

Формат шестнадцатеричной строки важен. Длина значения int является переменной.

Формат «0xffffbf949309L» у меня не работает. (Я получаю это с помощью hex (int-value))


Мое окончательное решение (после некоторой "игры"):

def _tohex(self, int_value):
    data_ = format(int_value, 'x')

    result = data_.rjust(12, '0')
    hexed = unhexlify(result)

    return hexed

Спасибо за помощь!

Ответы [ 3 ]

13 голосов
/ 29 июля 2011

Возможно, есть лучшее решение, но вы можете сделать это:

x = 281473900746245
decoded_x = hex(x)[2:].decode('hex') # value: '\xff\xff\xbf\xde\x16\x05'

Разбивка:

hex(x)                     # value: '0xffffbfde1605'
hex(x)[2:]                 # value: 'ffffbfde1605'
hex(x)[2:].decode('hex')   # value: '\xff\xff\xbf\xde\x16\x05'

Обновление:

Согласно @multipleinstances и комментариям @ Sven, поскольку вы можете иметь дело с длинными значениями, вам, возможно, придется немного подправить вывод hex:

format(x, 'x')     # value: 'ffffbfde1605'

Иногда, однако, вывод hex может бытьнечетной длины, что нарушает декодирование, поэтому, вероятно, было бы лучше создать функцию для этого:

def convert(int_value):
   encoded = format(int_value, 'x')

   length = len(encoded)
   encoded = encoded.zfill(length+length%2)

   return encoded.decode('hex')
3 голосов
/ 29 июля 2011

В Python 3.2 или выше вы можете использовать метод to_bytes() для интергера.

>>> i = 281473900746245       
>>> i.to_bytes((i.bit_length() + 7) // 8, "big")
b'\xff\xff\xbf\xde\x16\x05'
1 голос
/ 29 июля 2011

Если вы не используете Python 3.2 (я уверен, что вы не используете), рассмотрите следующий подход:

>>> i = 281473900746245
>>> hex_repr = []
>>> while i:
...     hex_repr.append(struct.pack('B', i & 255))
...     i >>= 8
...
>>> ''.join(reversed(hex_repr))
'\xff\xff\xbf\xde\x16\x05'
...