Python代码从32个字符中提取最后16个字符

时间:2017-03-17 13:35:43

标签: python python-2.7 bitwise-operators xor

我正在尝试使用python代码提取此十六进制值的最后16个字符,并使用相同的32个字符的前16位或128位值对其进行xor。我不确定这里使用什么功能。我试着把它作为一个字符串将长度除以一半然后xor这两个值。是否有一种可能的简单方法来找到提取这些位并对它们进行排序?

例如,我的32位值为:ee230c06cac0aa070be45290b1cb11ee

我的最后16位值应为:0be45290b1cb11ee;和
我的第一个16位值应为:ee230c06cac0aa07

1 个答案:

答案 0 :(得分:2)

  

注意:根据您的示例,您使用的是128位数字,并且您希望将其拆分为两个64位数字。然而,可以容易地修改下面描述的技术以用于任何数量的比特。

为了获得最低16位,您可以使用0xffff屏蔽,例如:

lowest_16 = number & 0xffff

现在为了获得最高16位,你可以移动(也可能是更好的掩码,因为在数字中有任意长度):

highest_16 = (number  >> 16 ) & 0xffff
#                     ^       ^ masking out higher bits
#                     | bitwise shift 16 position to the right

结果是:

result = ((number >> 16 ) & 0xffff) ^ (number & 0xffff)
#                                   ^ bitwise xor operation

请注意,您可以屏蔽xor (保存一位按位和操作),因为通过屏蔽,无论如何都将这些较高的值设置为零。所以你可以使它更高效,如:

result = ( (number >> 16 ) ^ number) & 0xffff

如果您想使用 128位数字,可以使用:

result_128 = ( (number >> 64 ) ^ number) & 0xffffffffffffffff
#                                          ^ 64-bit mask

例如:

>>> number = 0xee230c06cac0aa070be45290b1cb11ee
>>> hex(( (number >> 64 ) ^ number) & 0xffffffffffffffff) # xor-ing
'0xe5c75e967b0bbbe9'
>>> hex(number >> 64) # highest bits
'0xee230c06cac0aa07'
>>> hex(number & 0xffffffffffffffff) # lowest bits
'0xbe45290b1cb11ee'