在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把0和1、True和False、Yes和No这样的布尔值每8个只占用一个字节,用字节中的位来表示。减少传输量,减少对网络稳定性的要求。这就带来了要怎么读某个字节中每一位的值和怎么设置每一位的值的问题。
这几天再写培训演示代码,顺便就写了两个函数,解决字节位值读写问题,现在分享给大家。
下面直接上代码,在Python3上测试通过:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def get_bit_val(byte, index):
"""
得到某个字节中某一位(Bit)的值
:param byte: 待取值的字节值
:param index: 待读取位的序号,从右向左0开始,0-7为一个完整字节的8个位
:returns: 返回读取该位的值,0或1
"""
if byte & (1 << index):
return 1
else:
return 0
def set_bit_val(byte, index, val):
"""
更改某个字节中某一位(Bit)的值
:param byte: 准备更改的字节原值
:param index: 待更改位的序号,从右向左0开始,0-7为一个完整字节的8个位
:param val: 目标位预更改的值,0或1
:returns: 返回更改后字节的值
"""
if val:
return byte | (1 << index)
else:
return byte & ~(1 << index)
print(get_bit_val(3, 2)) # 3的2进制00000 0 11,2号位是0,打印结果0
print(get_bit_val(3, 1)) # 3的2进制000000 1 1,1号位是1,打印结果1
print(get_bit_val(3, 5)) # 3的2进制00 0 00011,5号位是0,打印结果0
print(set_bit_val(3, 2, 1)) # 3的2进制00000 0 11,2号位改成1,打印结果7(00000111)
print(set_bit_val(3, 1, 0)) # 3的2进制000000 1 1,1号位改成0,打印结果1(00000001)
print(set_bit_val(3, 5, 0)) # 3的2进制00 0 00011,5号位改成0,打印结果3(00000011)
"""
控制台输出:
0
1
0
7
1
3
"""