我是新来的,所以请原谅我可能犯过的任何错误:)
我一直在尝试使用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的形式存储数字。例如,带有输入'a'的print语句的输出是
input[]: a
output[]: a 10 0xa
c)使用hex()然后使用它们
ip = input(">> ")
ip=int(ip, 16)
ip=hex(ip)
同样,这也给出了一个字符串。
我需要一种接收十六进制数字的方法,并且能够以完全相同的方式进一步使用它们,而不是字符串或小数。这可能吗?
编辑:简而言之,我可以使用某种形式的十六进制来添加,减去,向左移动等。答案 0 :(得分:0)
我认为最接近的是将数据存储为字节。字节实际上在python .hex()
中有一个内置方法,所以你总能看到它的十六进制表示。
my_bytes = b'some words'
my_bytes.hex() #'736f6d6520776f726473'
如果您将数据raw作为字节发送,则可以进行直接比较而不必担心十六进制。但是,如果您仍希望将十六进制发送为字符串,则需要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
。