在Python中将1加到16字节的数字

时间:2018-05-17 10:55:22

标签: python python-3.x

我正在尝试改进的程序具有以下代码,用于在byterray中将16位字节数加1:

for k in range(15, -1, -1):
    payload[k] = (payload[k] + 1) & 0x0ff
    if payload[k]:
        break

因此,它在最后一个字节中加1,处理溢出,如果结果是假的(0x00),它会继续并在它之前的字节加1,否则它会停止。

对我来说,这似乎是一件好事,而且我试图想出更好的东西,如果不是为了性能或可靠性,那么至少它看起来如何。

到目前为止,我已经得到了这个,在我的测试中产生了相同的结果:

hi,lo = struct.unpack('>QQ', payload)
payload = struct.pack('>QQ', hi, lo + 1)

我知道我的代码在运行最多2 ^ 64次后会失败,但是我很确定代码不会为一个数字运行超过几百次,所以超过最后几个字节变化的可能性很小。

关于我的预期改进,其他/更好的方法来获得相同结果的任何建议?当然,如果有一个简单的解决2 ^ 64限制,我很乐意看到它!

谢谢。

1 个答案:

答案 0 :(得分:4)

您可以使用int.from_bytes() methodbytearray直接转换为整数,然后使用int.to_bytes()返回bytes个对象:

incremented = int.from_bytes(payload, 'big') + 1
try:
    payload = bytearray(incremented.to_bytes(len(payload), 'big'))
except OverflowError:
    # value won't fit into the payload, wrap round to 0
    payload = bytearray(len(payload))

我不确定当你达到上限时会发生什么;您可以恢复为0bytearray(len(payload))),坚持旧的(2 ** 128) - 1值或做其他事情。