python3 把十六进制数值解包为二进制并取出其中1的位置

桜庭清夏 · 2021-03-16 01:41:40 


做嵌入式 硬件开发之类的工作时会经常碰见位运算,为了表示开关状态方便,通常采用二进制形式进行存储开关电平等状态。然而一串11001100的数据看着不仅麻烦,存储起来也很麻烦,所以就有了把二进制数据打包为十六进制的行为。比如11001011可以表示为0xCB。

有了十六进制这个压缩版的数据了,想解回去并且对应取出1的位置就要稍微复杂一些了。

例:有个列表,floors = [“1F”, “2F”, “3F”, “4F”, “5F”, “6F”, “7F”, “8F”],假设是电梯的层数列表。其中1代表该楼层可用,0代表该楼层不停。现在要求1,2,5,7,8楼经停,其他楼层不停。这时可以使用11001011来代表这个状态,此时顺便压缩为0xCB。

然后假设这个0xCB的数据由电梯主控传给了中控台,这时中控台要显示哪层楼可停,哪层楼不可停就要进行解包操作了。

送来的数据是0xCB,想要的结果是1F,2F,5F,7F,8F。

程序如下:

floors = ["1F", "2F", "3F", "4F", "5F", "6F", "7F", "8F"]
#           1    1      0     0     1     0     1     1
print(hex(0b11001011))
# 0xcb 压缩二进制为十六进制
result = [] # 存储1的下标 预初始化
floors_available = [] # 存储从floors里面指定下标的数据 预初始化
for i,x in enumerate(list(bin(int("0xcb", 16))[2:])): # [2:]是去掉0b的开头,enumerate是计循环次数
    if x == '1': # x是上面把一串数字拆分成单个字符进行循环判定每一位 如果是1的话就执行下面的语句
        result.append(i) # 把下标加进数组
print(result)
# [0, 1, 4, 6, 7]
for floor in result:
    floors_available.append(floors[floor]) # 从元数据floors里面按照下标列表去逐个抽数值并组成新的列表
print(f"Now these floors available: {' '.join(floors_available)}") # 整合数据
# 最终结果
# Now these floors available: 1F 2F 5F 7F 8F


你是否会像清风拂过花儿一样与我相遇呢?