目标是能够做到:
struct.pack('!H', x)
但如果
x
大于 65535
,那么这将因显而易见的原因而失败。我不是一个精通位操作的巫师,但我理解
<<
操作将失去任何移动的位。但我不知道如何从二进制/字节字符串中提取一个或多个进位位,并将进位值添加到尾随进位字节的两个字节集中。
我需要每次遍历2个字节的字节串并将它们与前两个字节相加。偶尔会生成大于 65535
的值, 这就是我需要从结果中提取进位位的地方,并对结果进行 +
运算,以及进位位本身(见下图)。
这是我想要完成的事情:
(在这种情况下,只有一个进位位,而2个尾随字节将得到 +1
作为结果。)
这是我目前获得的内容:
from struct import unpack, pack
from binascii import *
even_bytes_string = b'\x45\x00\x00\x3c\x1c\x46\x40\x00\x40\x06\xac\x10\x0a\x63\xac\x10\x0a\x0c'
result = None
for i in range(0, len(even_bytes_string)-1,2):
if not result:
result = unpack('!H', even_bytes_string[i:i+2])[0]
continue
result += unpack('!H', even_bytes_string[i:i+2])[0]
if result > 65535:
# Got a carry bit.
pass
print(result)
print(pack('!H', result))
我真的不知道如何完成这个相当简单的任务,而不将加法操作的结果转换为实际的二进制表示形式(
11001...
)然后进行字符串处理s = s[-16:]+s[:-16]
(过于简化),最后将其转回一组2字节。这似乎不太实用、快速或正确。我希望你们中的一个熟练掌握Python位操作的人告诉我如何正确地完成此操作。肯定有方法的。
我尝试完成的稍微更混乱的图像(保持结果为2字节,在其中删除任何进位位并将它们作为“单独”的值添加到结果中)。:
(x & 0xFF) + (x >> 16)
。 - jez