Python 中的 Checksum 为什么结果是一长串数字而不是其他格式?

在写一个检验仪器的串口指令发送,需要对发送数据 Checksum ,仪器发给电脑的接收数据,仪器已经 Checksum 了。如下原始数据

5C|1|I|In Check Range|I                                       
FD (上一行的 Checksum 值)                                             
7C|1|I|In Check Range|I                                       
FF (上一行的 Checksum 值)                                             
0R|4|^^^HBs^^^1^RLU|8982|||H|N|R||||20161229094052|IRL55791525
E1 (上一行的 Checksum 值)                                             
1C|1|I|In Check Range|I                                       
F9 (上一行的 Checksum 值)                                             
2L|1|N                                                        
05 (上一行的 Checksum 值) 

使用

0x04+0x00+0x38+0x00+0x01=0x3d= - 0x3C;  // - 0x3d=3C; 

也无法算对,有明白的没法给指点下。 另外对于串口的应答方式有什么灵活办法处理吗? 我现在是 n=serial.inWaiting(),如果 n=1 ,判断是 ACK 还是 ENQ 等,并做相应的应答写死在程序里面。但是如果一段数据结尾有 ENQ 我该怎么处理,每次收到不为空数据 data[-1:]判断并进行应答?


Python 中的 Checksum 为什么结果是一长串数字而不是其他格式?

2 回复

Checksum(校验和)本质上是一个通过特定算法(如CRC32、MD5、SHA-1等)计算出的数值摘要。在计算机底层,所有数据(包括文件、字符串)最终都被视为二进制序列。校验和算法就是对这个二进制序列进行数学运算,生成一个固定长度的整数结果

在Python中,无论你使用hashlib库(如MD5、SHA系列)还是zlib库(如CRC32),计算出的结果都是一个非常大的整数。为了方便显示和传输,我们通常将这个整数转换为十六进制(hex)字符串。十六进制表示更紧凑,且是校验和输出的标准格式。例如,你看到的“a1b2c3d4…”这样的长字符串,就是那个大整数的十六进制形式。

这里是一个简单的代码示例,展示为什么以及如何得到这个“一长串数字”:

import hashlib

data = "Hello, World!".encode('utf-8')  # 将字符串转换为字节序列

# 使用MD5算法计算校验和
md5_hash = hashlib.md5(data)
# 结果是一个哈希对象,其内部核心是一个整数

# 获取这个整数的十进制表示(通常很大,不方便看)
integer_digest = int.from_bytes(md5_hash.digest(), byteorder='big')
print(f"整数形式的校验和: {integer_digest}")
# 输出示例: 334577269844468577088008037829530478592

# 获取标准的十六进制字符串表示(这就是你常看到的一长串)
hex_digest = md5_hash.hexdigest()
print(f"十六进制字符串形式的校验和: {hex_digest}")
# 输出示例: 65a8e27d8879283831b664bd8b7f0ad4

核心解释:

  1. 算法输出是整数:所有校验和/哈希算法的数学运算结果本质上都是一个固定位宽(如MD5是128位)的整数。
  2. 十六进制是标准显示格式:直接显示一个巨大的十进制整数不便于人类阅读和比对。将其转换为十六进制(hex)字符串,每一位对应4位二进制,长度固定且更易读,成为通用的表示方式。
  3. hexdigest()的作用:Python的hashlib库提供的.hexdigest()方法,就是帮你完成了从整数到十六进制字符串的转换。

一句话总结:校验和结果是数值,十六进制字符串是其标准、便于使用的表示形式。


0x04+0x00+0x38+0x00+0x01
我算出结果是 61

回到顶部