我正在尝试使用python代码提取此十六进制值的最后16个字符,并使用相同的32个字符的前16位或128位值对其进行xor。我不确定这里使用什么功能。我试着把它作为一个字符串将长度除以一半然后xor这两个值。是否有一种可能的简单方法来找到提取这些位并对它们进行排序?
例如,我的32位值为:ee230c06cac0aa070be45290b1cb11ee
我的最后16位值应为:0be45290b1cb11ee
;和
我的第一个16位值应为:ee230c06cac0aa07
答案 0 :(得分:2)
注意:根据您的示例,您使用的是128位数字,并且您希望将其拆分为两个64位数字。然而,可以容易地修改下面描述的技术以用于任何数量的比特。
为了获得最低16位,您可以使用0xffff
屏蔽,例如:
lowest_16 = number & 0xffff
现在为了获得最高16位,你可以移动(也可能是更好的掩码,因为在python-3.x数字中有任意长度):
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'