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

时间:2018-05-30 03:23:36

标签: python hex

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

我一直在尝试使用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)

同样,这也给出了一个字符串。

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

编辑:简而言之,我可以使用某种形式的十六进制来添加,减去,向左移动等。

1 个答案:

答案 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