从hexa字符串

时间:2018-04-04 21:34:21

标签: python bitwise-operators

我正在开发一个实时应用程序,我必须尽快处理一行数据,然后将其发送到应用程序。这些线路以非常快的速度到达,大约每分钟40k。任务是从行中的hexa数据中提取某些单独位的值。我已经有了一个解决方案,但我怀疑它是最有效的解决方案,所以我问你是否可以改进它。

数据样本系列:

p1                p2      p3     len  data
1497383697        0120    000    5    00 30 63 4f 15

len 是数据中的字节数,数据是我们正在使用的。让我们说我想从左边第11位开始提取3位。使用填充将hexa转换为二进制:
0x0030634f15 = 0000 0000 00 11 0 000 0110 0011 0100 1111 0001 0101
想要的值是0b110,十进制是6。

我解决问题的方法是:

# 11 and 3 in the example
start = config.getint(p, 'start') 
length = config.getint(p, 'length')

parts = line.split()
hexadata = ''.join(parts[4:])
bindata = bin(int(hexadata, 16))[2:].zfill(len(hexadata) * 4)
val = int(bindata[start:start + length], 2)

val 最后会保留值6。还有其他更有效的方法吗?谢谢

1 个答案:

答案 0 :(得分:2)

不是使用字符串操作,而是将输入转换为数字并使用位操作更快:

parts = line.split(maxsplit=4)

# remove spaces in the number and convert it to int from base 16
num = int(parts[4].replace(' ', ''), 16)

# create a bit mask with exactly `length` 1s
mask = (1 << length) - 1

# calculate the offset from the right
shift = 40 - start - length

# shift the value to the right and apply the binary mask to get our value
val = (num >> shift) & mask

根据我的时间,位操作速度提高了约20%。时间结果有100万次迭代:

string_ops  2.735653492003621 seconds
bit_ops     2.190693126998667 seconds