在python中如何在不使用hex()的情况下从十进制转换为十六进制?

在python中如何在不使用hex()的情况下从十进制转换为十六进制?,python,hex,Python,Hex,我是新来的,所以请原谅我可能犯的任何错误:) 在我可以在实际设备上测试之前,我一直在尝试使用Python3通过虚拟串行端口对发送十六进制数。但是,到目前为止,我发现使用十六进制数的唯一方法是: a) 将它们用作常规字符串 num_hex = input() 但这不允许我处理数字,因为num_hex是一个字符串 b) 使用int(,16)转换它们 当这里使用num_ip_hex时,只需以10为基数存储数字。例如,带有输入“a”的print语句的输出是 input[]: a output[]:

我是新来的,所以请原谅我可能犯的任何错误:)

在我可以在实际设备上测试之前,我一直在尝试使用Python3通过虚拟串行端口对发送十六进制数。但是,到目前为止,我发现使用十六进制数的唯一方法是:

a) 将它们用作常规字符串

num_hex = input()
但这不允许我处理数字,因为num_hex是一个字符串

b) 使用int(,16)转换它们

当这里使用num_ip_hex时,只需以10为基数存储数字。例如,带有输入“a”的print语句的输出是

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

c) 使用hex()然后使用它们

ip = input(">> ")
ip=int(ip, 16)
ip=hex(ip)
同样,这也给出了一个字符串

我需要一种方法来接收十六进制数,并能够以完全相同的方式进一步处理它们,而不是作为字符串或小数。这可能吗


编辑:简而言之,我可以使用某种形式的十六进制来进行加法、减法、左移位等操作。

我认为最接近的方法是将数据存储为字节。字节实际上在python中有一个内置的方法
.hex()
,所以您总是可以看到它的十六进制表示形式

my_bytes = b'some words'
my_bytes.hex()   #'736f6d6520776f726473'
如果您以字节的形式发送原始数据,那么就可以进行直接比较,而不必担心十六进制。但是,如果仍希望以字符串形式发送十六进制,则需要
binascii.unhexlify()

虽然通常更倾向于发送字节,但这样您就不必担心编码和其他问题

希望这有帮助

编辑:如果要添加直接处理您提供的代码的操作,它将如下所示:

 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)

然后您可以通过testring直接发送

什么是“十六进制数”?在大多数现代体系结构中,基本数字类型是二进制的,只有当您使用“十六进制数字”时,它们打印到屏幕上的方式才会改变。或者你想要一个特定的字节序列,用你输入的十六进制数字表示?是的,类似这样的。我最终想做的是通过串行端口向机器发送一系列十六进制数字,并接收传入的十六进制数字,以便检查它们的加密。例如,如果我收到“01 41 23 44 2f 5a”,我稍后将通过一系列步骤对其进行处理,以检查发送的数据是否正确或被篡改谢谢!但是如何将十六进制转换为字节来发送它呢?到目前为止,我只知道“ip=input()ip=int(ip,16)bytestring=ip.to_bytes(1,'little')print(整数中的数字是{int},字节中的数字是{bytes})。format(int=ip,bytes=bytestring),“hex是”,hex(ip)),实际上,
bytestring
右边有字节,它可以按原样发送。还将编辑post以显示如何一次输入多个十六进制数:)好的,因此我尝试使用bytestring,但当我在接收端使用“ip_int=int.from_bytes(ip,byteorder='little')”重新转换它时,它会返回一个普通的旧十进制数。例如,我尝试使用“12”,将它转换为字节,发送它,然后接收它,在使用我在这里提到的语句之后,我得到的是“18”,而不是“12”。你能帮帮我吗?:)在接收端,尝试执行just do ip.hex(),而不是从_bytes开始。刚尝试过,它可以工作,但它以字符串形式给出12。很抱歉再次打扰您,有没有办法将其作为数字12接收?
 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
# Remove whitespace, allow for entry with or without spaces
ip = input().strip().replace(' ', '') 

bytestring  = binascii.unhexlify(ip)