我需要通过两个不同的十六进制字符串传输大于65535的值,这样当接收到字符串时,它们可以连接起来再次形成整数。例如,如果值为70000,则两个字符串将为0x0001和0x1170。
我认为这很简单,只需将整数转换为十六进制,然后将其右移4,即可获得顶部字符串并删除除底部最后4个字符以外的所有字符。
我想我可能会遇到一些语法(相当新的Python),也可能是一些逻辑。谁能想到一个简单的方法呢?
由于
答案 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)