Алгоритм шестнадцатеричного числа - PullRequest
0 голосов
/ 24 марта 2020

Без использования встроенного python, я хотел бы написать подпрограмму basi c, чтобы найти значение numberri c по заданной шестнадцатеричной строке. (Другими словами, я не хочу использовать int('8c', 16)) - это для целей обучения).

Вот что у меня есть:

def hex_to_number(hex_string, num=0):
    number_map = {'0':0,'1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15}
    for char in hex_string:
        num = num << 4
        num += number_map[char]
    return num

Это возможно ли это преобразование без карты чисел вверху или это необходимо для шестнадцатеричного преобразования? Если нет, то как еще может быть построен алгоритм (или даже однострочный) для этого?

1 Ответ

3 голосов
/ 24 марта 2020

Вы можете использовать ord(char). Быстрый пример без проверки достоверности (например, можно добавить a-f обработку)

for char in hex_string:
    num = (num << 4) + (ord(char) - ord("0") if char < "A" else 10 + ord(char) - ord("A"))

Объяснение:

Di git "0" имеет код 0x30 (48), другие цифры имеют следующие коды в последовательности, поэтому, чтобы получить число c значение di git, мы должны вычесть «базовое» значение. То же самое верно для диапазона «A» - «F» (код «A» равен 0x41 (65)).

Таблица ASCII

Еще один прием для обработки также маленькие буквы (не пример хорошего кода;):

shifts = [48, 55, 87]
for char in hex_string:
    num = (num << 4) + (ord(char) - shifts[(ord(char) // 32) - 1])

ord(char) // 32 дает результаты 1,2,3 для диапазонов цифр, больших и маленьких букв. Затем вычитаем соответствующее базовое значение (shifts)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...