基于十六进制传输的字符串校验算法
来源:互联网 发布:范尼凯克400 知乎 编辑:程序博客网 时间:2024/06/04 19:29
由于在项目中,经常会碰到一些十六进制传输的字符串,今天看文档,看了一个不错的校验算法,来分享一下:
传输包的命令格式如下:
CMD - NBF - [data_byte0... data_byten] - CKS
where:
CMD - 命令字节,范围: 80h - FFh
NBF- 命令字节数,从data_byte0... data_byten 到CKS校验位的字节数
data_byte0... data_byten- 数据字节 从0 到n
CKS - 校验位
校验算法依据如下:
校验码计算公式:
CKSUM = (not (CMD + NBF + [data byte0] + ... [data byten] ) + 1) & 7Fh
根据规律,我们可以得出如下的推导,也就可以以此公式来作为验证的公式:
( ( CMD + NBF + [data byte1] + ... [data byten]) & 7Fh) + CKSUM) & 7Fh = 0
例子:
Example:
假如命令为:CAh 02h 00h CHKSUM
CHKSUM = not (CAh + 02h+ 00h)
= not (CCh)
= 34h
因此, 完整的命令是: CAh 02h 00h 34h
下面是相关的C语言校验码计算代码:
enum Boolean {FALSE, TRUE};void AddChecksum(short num, char buf[]){ char checksum; short i; checksum = 0;for (i = 0; i < num; i++)checksum = (char) (checksum + buf[i]);checksum = (char) ((-checksum) & 0x7F);buf[num] = checksum;}
下面是相关的C语言包验证的代码:
Boolean IsChecksumValid(char *lpBuf, short num){ char checksum; checksum = *lpBuf; lpBuf++; num--; for (; num > 0; num--) {if (*lpBuf >= 0x80)return FALSE; // invalid data bytechecksum = (char) (checksum + *lpBuf);lpBuf++;} checksum &= 0x7F; if (checksum == 0)return TRUE; else return FALSE; // invalid checksum}
- 基于十六进制传输的字符串校验算法
- c#计算十六进制字符串的和校验
- Android开发中遇到的字符串、十六进制和Byte转换,及十六进制校验等函数集
- 十六进制字符串异或校验函数,自创
- 基于字符串的hash算法
- 【算法C++】十进制字符串转十六进制字符串
- 十六进制字符串转十六进制数值的方法
- UDP传输的基于反馈机制的速度控制算法
- Modbus的传输方式和校验
- ]输出十六进制定位的字符串
- CRC校验的算法
- 基于字符串的分离链接hash算法
- 基于后缀树的字符串匹配算法
- 基于字符串的分离链接hash算法
- 八进制与十六进制的算法
- 十六进制转换的高效算法
- 基于Ajax的输入校验
- 基于struts2框架的校验
- css-文字超出显示省略号
- CDN技术
- 土坷垃的情怀
- C#笔记整理(1)C#初步
- Android平台下使用HttpUrlConnection
- 基于十六进制传输的字符串校验算法
- linux 动态库的创建与使用
- 初学Android,短信管理器之发送短信(六十五)
- Android Audio代码分析10 - audio_track_cblk_t::framesReady函数
- Android去掉标题栏和全屏以及设置修改Android超时休眠时间
- C#笔记整理(2)C#语言基础
- “王鹏你妹”让人笑不起来
- Activity启动过程
- IOS程序内发短信 MFMessageComposeViewController