Есть ли способ дополнить четное количество цифр? - PullRequest
8 голосов
/ 06 декабря 2010

Я пытаюсь создать шестнадцатеричное представление некоторых данных, которые должны быть переданы (в частности, в нотации ASN.1). В некоторых моментах мне нужно преобразовать данные в их шестнадцатеричное представление. Поскольку данные передаются в виде последовательности байтов, шестнадцатеричное представление должно быть дополнено 0, если длина нечетна.

Пример:

>>> hex2(3)
'03'
>>> hex2(45)
'2d'
>>> hex2(678)
'02a6'

Цель состоит в том, чтобы найти простую, элегантную реализацию для hex2.

В настоящее время я использую hex, удаляя первые два символа, а затем добавляя строку с 0, если ее длина нечетна. Тем не менее, я хотел бы найти лучшее решение для дальнейшего использования. Я посмотрел в str.format, не найдя ничего, что дополняет кратность.

Ответы [ 4 ]

7 голосов
/ 06 декабря 2010
def hex2(n):
  x = '%x' % (n,)
  return ('0' * (len(x) % 2)) + x
7 голосов
/ 06 декабря 2010

Честно говоря, я не уверен, в чем проблема.Прямая реализация того, что вы описываете, выглядит следующим образом:

def hex2(v):
  s = hex(v)[2:]
  return s if len(s) % 2 == 0 else '0' + s

Я бы не обязательно назвал это "элегантным", но я бы определенно назвал это "простым".

0 голосов
/ 27 января 2018

binascii модуля Python b2a_hex гарантированно возвращает строку четной длины.

Задача состоит в том, чтобы преобразовать целое число в строку байтов.Python3.2 и выше имеет встроенную в int:

from binascii import b2a_hex

def hex2(integer):
    return b2a_hex(integer.to_bytes((integer.bit_length() + 7) // 8, 'big'))
0 голосов
/ 06 декабря 2010

Возможно, стоит взглянуть на модуль struct, который предназначен для байтово-ориентированного ввода-вывода.

import struct
>>> struct.pack('>i',678)
'\x00\x00\x02\xa6'
#Use h instead of i for shorts
>>> struct.pack('>h',1043)
'\x04\x13'
...