在Python中从十六进制字节对象中提取单个位的更优雅方法?

时间:2017-09-01 10:06:24

标签: python

我有这个工作代码,但它看起来太复杂了,它确实做了什么。

基本上我想基于从字节对象中提取的特定位来创建一个十六进制字(该字符串是一个VISCA PTZ字符串)。在这个例子中,所需的结果是0x00(或其十进制等效,这并不重要),但如果涉及更多位,也可以是0x0000。

aa = b'\x80\x01\x04\x48\x00\xff'
# extract these --^---^

bb = b""
cc = 0
    for i in range(0, len(aa), 1):
    partial = aa[i:i+1]
    if i == 2:
        j = [partial[0] & b'\x0f'[0]]
        cc = cc << 4 | j[0]
    elif i == 3:
        j = [partial[0] & b'\x0f'[0]]
        cc = cc << 4 | j[0]
    bb = bb + partial

print (cc)      # gives 72 = 48 hex (which is the intended result)

也许稍后我还需要更改一些位并将其放回字节字符串(此代码还没有代码)。

我通过直接读取原始字节字符串的成员来玩了一下,但我搞砸了不同对象类型之间的冲突。

有更简单优雅的方法吗? (Python 3.5)

1 个答案:

答案 0 :(得分:1)

aa = b'\x80\x01\x04\x48\x00\xff'

part1, part2 = aa[2] & 0xf, aa[3] & 0xf
print(hex(part1 << 4 | part2))

对于更多部分,表达式将更复杂,但仍比您所做的更简单。