TOF Sense激光测距模块校验和的理解

def validate_checksum(self, data, expected_checksum):
 
        num = len(data) // 2

        checksum = sum(int(data[i : i + 2], 16) for i in range(0, num * 2, 2))
#         tempT = [data[i : i + 2] for i in range(0, num * 2, 2)] 
#         print(tempT)
        calculated_checksum = hex(checksum)[-2:]
#         calculated_checksum = checksum & 0xFF  # 取低8位作为校验和
       
        return calculated_checksum == expected_checksum    

checksum = sum(int(data[i : i + 2], 16) for i in range(0, num * 2, 2))这句代码的目的是遍历一个包含十六进制数字的字符串,并将这些十六进制数字转换为十进制整数,最后对这些整数求和。

让我们用一个具体的例子来解释这句代码:

假设 expected_checksum 数据为:3a  data 是 "data = "57 00 ff 00 9e 8f 00 00 ad 08 00 00 03 00 ff"",这是一个包含15个字节(每个字节由两个十六进制数字表示)的字符串。

  1. 首先,计算 num 的值:num = len(data) // 2 # 因为每两个字符表示一个字节 # 所以 num = 30 // 2 = 15

  2. 然后,使用 range(0, num * 2, 2) 生成一个迭代序列:# range(0, 30, 2) 生成 [0, 2, 4, 6,8,10,12,14,16,18,20,22,24,26,28]

  3. 对于序列中的每个值 i,提取 data[i : i + 2],即两个字符(一个字节的十六进制表示),并将其转换为十进制整数:

    • 当 i = 0 时,data[0 : 2] 是 "57",转换为十进制是 87
    • 当 i = 2 时,data[2 : 4] 是 "00",转换为十进制是 0
    • 当 i = 4 时,data[4 : 6] 是 "ff",转换为十进制是 255
    • 当 i = 6 时,data[6 : 8] 是 "00",转换为十进制是 0
    • 当 i = 8 时,data[8 : 10] 是 "9e",转换为十进制是 158
    • 当 i = 10 时,data[10 : 12] 是 "8f",转换为十进制是 143
    • 当 i = 12 时,data[12 : 14] 是 "00",转换为十进制是 0
    • 当 i = 14时,data[14 : 16] 是 "00",转换为十进制是 0
    • 当 i = 16 时,data[16 : 18] 是 "ad",转换为十进制是 173
    • 当 i = 18时,data[18 : 20] 是 "08",转换为十进制是 8
    • 当 i = 20 时,data[20 : 22] 是 "00",转换为十进制是 0
    • 当 i = 22 时,data[22 : 24] 是 "00",转换为十进制是 0
    • 当 i = 24 时,data[24 : 26] 是 "03",转换为十进制是 3
    • 当 i = 26 时,data[26 : 28] 是 "00",转换为十进制是 0
    • 当 i = 28 时,data[28 : 30] 是 "ff",转换为十进制是 255               checksum = 87+255+158+143+173+8+3+255 # 所以 checksum = 1082 十六进制是43a  calculated_checksum = hex(checksum)[-2:]=3a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值