将整数拆分为两个连接的十六进制字符串 - Python

时间:2012-06-20 16:48:51

标签: python hex bit-manipulation

我需要通过两个不同的十六进制字符串传输大于65535的值,这样当接收到字符串时,它们可以连接起来再次形成整数。例如,如果值为70000,则两个字符串将为0x0001和0x1170。

我认为这很简单,只需将整数转换为十六进制,然后将其右移4,即可获得顶部字符串并删除除底部最后4个字符以外的所有字符。

我想我可能会遇到一些语法(相当新的Python),也可能是一些逻辑。谁能想到一个简单的方法呢?

由于

5 个答案:

答案 0 :(得分:2)

使用divmod内置功能:

>>> [hex(x) for x in divmod(70000, 65536)]
['0x1', '0x1170']

答案 1 :(得分:1)

你的意思是这样吗?

In [1]: big = 12345678
In [2]: first, second = hex(big)[2:][:-4], hex(big)[2:][-4:]
In [3]: first, second
Out[3]: ('bc', '614e')

In [4]: int(first+second, 16)
Out[4]: 12345678

答案 2 :(得分:1)

您的算法可以轻松实现,如Lev Levitsky的回答:

hex(big)[2:-4], hex(big)[-4:]

但是,对于65536以下的数字,它将失败。

你可以解决这个问题,但你可能最好分割数字,然后将两半转换为十六进制,而不是分割十六进制字符串。

ecatmur的答案可能是最简单的方法:

[hex(x) for x in divmod(70000, 65536)]

或者你可以在这样的数字上翻译你的“shift right / truncate”算法:

hex(x >> 16), hex(x & 0xFFFF)

如果您需要将这些字符串设置为'0x0006'而不是'0x6',而不是在部件上调用hex,则可以执行以下操作:

['%#06x' % (x,) for x in divmod(x, 65536)]

或者,使用更现代的字符串格式样式:

['0x{:04x}'.format(x) for x in divmod(x, 65536)]

但另一方面,你可能想要通过首先转换为int然后转换并屏蔽数字而不是连接字符串来撤消这一点。 ecatmur答案的反面是:

int(bighalf) * 65536 + int(smallhalf)

移位/掩码实现的(等效)反转是:

(int(bighalf) << 16) | int(smallhalf)

在这种情况下,你不需要左边的额外0。

值得指出的是,如果数字可以为负数或大于4294967295,则这些算法都不会起作用,但这只是因为在这些情况下不可能出现问题。

答案 3 :(得分:0)

对于大于65536的数字或长度为>=5的数字,您可以使用slicing

>>> num=70000
>>> var1=hex(num)[:-4]
>>> var2='0x'+hex(num)[-4:]
>>> integ=int(var1+var2[2:],16)
>>> print(integ)
    70000

答案 4 :(得分:0)

警惕大/小端,你可以做的就是保持简单:

val = 70000
to_send = '{:08X}'.format(val) # '00011170'
decoded = int('00011170', 16) # 70000

编辑:非常清楚......

hex1, hex2 = to_send[:4], to_send[4:] # send these two and on receipt
my_number = int(hex1 + hex2, 16)