Как преобразовать из десятичного в шестнадцатеричный в Python без использования hex ()? - PullRequest
0 голосов
/ 30 мая 2018

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

Я пытался отправить шестнадцатеричные числа через виртуальную пару последовательных портов, используя Python3, прежде чем я смог протестировать его на реальном устройстве,Тем не менее, единственные способы работы с шестнадцатеричными числами, которые я нашел до сих пор:

a) Использовать их как обычную строку

num_hex = input()

Но это не позволяет мне работать надчисла, поскольку num_hex является строкой

.

b) Конвертируйте их, используя int (, 16)

ip_hex = input()
num_ip_hex = int(ip_hex, 16)
print(ip_hex, num_ip_hex, hex(num_ip_hex))

При использовании здесь num_ip_hex просто храните числа в видебаза 10. Например, выход для оператора print с вводом 'a' равен

input[]: a
output[]: a 10 0xa

.

c) Используйте hex (), а затем используйте их

ip = input(">> ")
ip=int(ip, 16)
ip=hex(ip)

Опять же, это также дает строку.

Мне нужен способ получения шестнадцатеричных чисел и для дальнейшей работы с ними точно таким же образом, а не в виде строк или десятичных дробей.Возможно ли это?

РЕДАКТИРОВАТЬ: Короче говоря, некоторая форма гекса, с которой я могу работать, например, сложение, вычитание, сдвиг влево и т. Д.

1 Ответ

0 голосов
/ 30 мая 2018

Я думаю, что самое близкое, что вы можете получить, это хранить данные в байтах.Байт на самом деле имеет встроенный метод в python .hex(), поэтому вы всегда можете увидеть его шестнадцатеричное представление.

my_bytes = b'some words'
my_bytes.hex()   #'736f6d6520776f726473'

Если вы отправляете необработанные данные в виде байтов, вы можете выполнить прямое сравнение, не беспокоясь о шестнадцатеричном коде.Однако, если вы все еще хотите отправить гекс в виде строки, вам понадобится binascii.unhexlify()

import binascii
binascii.unhexlify('736f6d6520776f726473')    # b'some words'

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

Надеюсь, что это поможет!

Редактировать: Хотелось бы добавить непосредственное отношение к предоставленному вами коду, это выглядело бы примерно так:

 comparable_bytes = b'verify_me'
 comparable_hex = '7665726966795f6d65'

 ip_hex = binascii.unhexlify(input('>> '))  # Input the Hex numbers

 assert ip_hex == comparable_bytes
 assert ip_hex.hex() == comparable_hex

Редактировать 2: Несколькошестнадцатеричный ввод

# Remove whitespace, allow for entry with or without spaces
ip = input().strip().replace(' ', '') 

bytestring  = binascii.unhexlify(ip)

Тогда вы можете напрямую отправить bytestring.

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