在Python中解析十六进制数的位偏移量

时间:2015-07-14 20:33:18

标签: python parsing bit-manipulation masking bits

我有一个64位十六进制数输入到我的脚本中 的 0x0000040800000000 即可。我想取这个数字并提取第39:32位。

这怎么可能?我一直在解析字符串的各个部分,并且最终陷入混乱。

我最初将它转换为二进制文件并从

中解析出字符串的各个部分
def connected? (connection_table, model1, model2)
    connection_table.class.find_by(model1, model2)
end 

1 个答案:

答案 0 :(得分:3)

您只需要先将十六进制字符串转换为整数,然后使用常规数学来提取位。

位编号通常从最低有效位开始,即以二进制显示时最右边的位为0.因此,要提取位39:32(连续8位),您只需要一个0xFF00000000的掩码。只需和你的号码一起,将结果向右移动32位。

使用十六进制值并提取第39到32位将得到值0x08。以下脚本向您展示了如何:

hex_string = "0x0000040800000000"
number = int(hex_string, 16)    # Convert to an integer
mask_39_to_32 = 0xFF00000000    # Suitable mask to extract the bits with

print "As hex: 0x%X" % number
print
print "Bits 39-32:                         xxxxxxxx"
print " As binary: {:0>64s}".format(bin(number)[2:])
print "      Mask: {:0>64s}".format(bin(mask_39_to_32)[2:])
print "AND result: {:0>64s}".format(bin(number & mask_39_to_32)[2:])
print "   Shifted: {:0>64s}".format(bin((number & mask_39_to_32) >> 32)[2:])
print " As an int: {:d}".format((number & mask_39_to_32) >> 32)

显示以下输出:

As hex: 0x40800000000

Bits 39-32:                         xxxxxxxx
 As binary: 0000000000000000000001000000100000000000000000000000000000000000
      Mask: 0000000000000000000000001111111100000000000000000000000000000000
AND result: 0000000000000000000000000000100000000000000000000000000000000000
   Shifted: 0000000000000000000000000000000000000000000000000000000000001000
 As an int: 8

47到40所需的面罩将是:

Bits 47-40:                 xxxxxxxx
 As binary: 0000000000000000111111110000000000000000000000000000000000000000
    As hex: 0xFF0000000000

十六进制的使用简单地使它不那么冗长,并且一旦习惯它就会更清晰。掩码的8位组总是以'FF'结尾。

关于bitwise operations的维基百科文章应该可以帮助您理解这个过程。