gpt4 book ai didi

python - 从十六进制字符串中提取各个位值的有效方法

转载 作者:行者123 更新时间:2023-12-01 02:00:49 25 4
gpt4 key购买 nike

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

数据示例行:

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

len 是数据中有多少字节,data 是我们正在处理的内容。假设我想提取从左边第 11 位开始的 3 位。使用填充将六进制转换为二进制:
0x0030634f15 = 0000 0000 0011 0000 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。还有其他更有效的方法吗?谢谢

最佳答案

不使用字符串运算,将输入转换为数字并使用位运算会更快:

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

关于python - 从十六进制字符串中提取各个位值的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49660813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com