上一次我们说到了Hex与Bytes的转换,很快我们又遇到了bit位的判断。
场景如下:我们需要判断DTC_Status的8个bit中任意一个或几个bit的状态。假设DTC_Status=0x2F,我们需要判断bit0和bit3是否为1.
解决这个问题的方法有很多。程序员往往喜欢用bit移位后与上0或1来进行判断。
但我总觉得这种方法不够直观,所以我通常会将每一个Bit都展开后,再去判断。
下面写一下大致的思路。
- 首先将Byte转为Bit, 这里用到了python自带的bin函数,zfill意为补齐8位。
DTC_Status = bin(DTC_Status)[2:].zfill(8)
#DTC_Status = '00101111'
转换后,DTC_Status已经是一个字符串了,其中包含了8个bits的0,1状态。
- 随后,我们可以写一个判断函数来比对实际和预期的bit位,
def bits_compare(act_byte, exp_bit):
if len(act_byte) != len(exp_bit):
print("bits_compare lenth different")
return False
i = 0
result = True
for exp, act in zip(exp_bit, act_byte):
i += 1
if exp == "x":
continue
if exp != act:
result = False
break
return result, i
有了这个函数后,我们就可以用bits_compare(DTC_Status , 'xxxx1xx1')的方式来判断DTC_Status了。x代表不需要判断的位。
这里也顺便提下,有时,我们也需要将一个二进制的值,如:'00001001' 转为十进制或十六进制。
此时,我们可以用int,加参数2来实现。通过字符串的切片操作,我们也可以更改某个bit的值。
int_10= int('00001001',2)
#int_10 = 9