HJ212 CRC16校验(python)

简介: 如果你在网上搜CRC16的代码以及使用在线的CRC16算出来的结果和我们HJ212的代码是不一样的,今天来看看 HJ212的python的写法吧。
WangScaler: 一个用心创作的作者。

声明:才疏学浅,如有错误,恳请指正。

HJ212文档

先来看看官方HJ212文档关于CRC16的描述:

image.png

image.png

image.png
如果你在网上搜CRC16的代码以及使用在线的CRC16算出来的结果和我们HJ212的是不一样的,所以这篇文章我标注了HJ212的CRC16校验。

那么开始吧撸我们的代码吧。官方的文档已经将算法描述的很清楚了,我们只需要将文档的内容翻译成代码即可。

代码如下

def crcFast(text):
    """
    HJ212-2017 crc16效验 wangscaler
    :param text: 待效验的字符串
    :return: result
    """
    data = bytearray(text, encoding='utf-8')
    crc = 0xffff
    dxs = 0xa001
    for i in range(len(data)):
        hibyte = crc >> 8
        crc = hibyte ^ data[i]
        for j in range(8):
            sbit = crc & 0x0001
            crc = crc >> 1
            if sbit == 1:
                crc ^= dxs
    data=str(hex(crc)[2:]).zfill(4)
    return data

这里我给最后的结果进行了补全4位,因为在测试过程中,出现了报文的检验码三位导致TcpServer解析失败。

根据HJ212的官方文档的介绍可知检验码是四位的,开始我怀疑我的CRC16生成的代码是错误的,仔细对比了文档 ,我也查阅了相关的资料,发现应该不是我写错了,而且其他报文都是正常返回结果,于是我找到官方的示例代码测试我的报文。

官方C源码

#include <stdio.h>

int main(void) {
    int a;
    a=CRC16_Checkout("QN=20200828112638954;ST=91;CN=9012;PW=123456;MN=sss;Flage=5;CP=&&ExeRtn=1&&",75);
    printf("%x",a);
    return 0;}
int CRC16_Checkout ( char *puchMsg,int usDataLen ) 
{
    unsigned int i,j,crc_reg,check; 
    crc_reg = 0xFFFF;
    for(i=0;i<usDataLen;i++)  
    { 
        crc_reg = (crc_reg>>8) ^ puchMsg[i];    
        for(j=0;j<8;j++)  
        {   
            check = crc_reg & 0x0001;   
            crc_reg >>= 1;         
            if(check==0x0001)  
                {    
                    crc_reg ^= 0xA001;
                }  
        } 
    }
    return crc_reg; 
} 

大家需要C语言版本的,可以直接使用官方的源码。对了,我测试的三位CRC的报文如下:

QN=20200828112638954;ST=91;CN=9012;PW=123456;MN=sss;Flage=5;CP=&&ExeRtn=1&&

经过测试官方的源码解析出来的CRC校验码也是三位。测试结果如下图:

image.png

我再次去网上查阅了相关的资料,发现有的作者像我一样做了补全,有的作者没有补全。
我认为补全更合理,但是HJ212官方给的C语言源码是没有补的,不知道是当时没考虑到还是怎样。

总结

总之,你是否补全应该取决于你们的公司内部协商的结果,即客户端和服务端保持一致即可,要么都补全,要么都不补全,个人建议补全,如果你认为我的想法有错误,恳请指正。

本人本篇CSDN原文,请戳HJ212_CRC16校检 _Python.感谢您的观看!

来都来了,点个赞再走呗!

关注WangScaler,祝你升职、加薪、不提桶!

目录
相关文章
|
JSON 数据格式 Python
Python 参数校验的进化
事情的起因是感觉目前项目中的参数校验方法写的太简单了,很多时候需要在server层再if else处理,于是就动手准备写一个好用一点的,可以自定义校验参数规则的参数校验器,考虑到要可以灵活的配置就萌生了大概的印象: 使用map - 参数A:ruleA,参数B-ruleB.
2400 0
|
5月前
|
安全 数据安全/隐私保护 Python
【Leetcode刷题Python】密码校验
文章提供了一个Python程序,用于验证密码是否符合特定的安全标准,包括密码长度至少为6,数字字符个数少于字母字符个数,没有连续5个字符是字母,以及没有连续两个字符是一模一样的,并输出每个密码是否符合这些条件。
39 3
|
8月前
|
人工智能 API 数据安全/隐私保护
oauthlib,一个强大的 Python 身份校验库!
oauthlib,一个强大的 Python 身份校验库!
147 1
|
8月前
|
JSON 人工智能 算法
pyjwt,一个强大的 Python JWT解析校验库!
pyjwt,一个强大的 Python JWT解析校验库!
199 0
|
JSON 数据格式
14-Python-对比校验神器-deepdiff库
14-Python-对比校验神器-deepdiff库
|
数据安全/隐私保护 Python
Python:Werkzeug.security对密码进行加密和校验
Python:Werkzeug.security对密码进行加密和校验
189 0
|
数据安全/隐私保护 Python
Python:bcrypt对密码进行加密和校验
Python:bcrypt对密码进行加密和校验
717 0
|
算法 Python
怎么使用 Python 校验银行卡号码是否有效
最近在公司有一个 fakedata 的项目,用来生成各类假数据,在各种测试环境,其中就有银行卡卡号的生成。简单来说,就是国内的银行卡卡号,主要都是银联标准,然后前面的4-8位称之为卡 bin,这个卡 bin 是可以区分是具体哪个银行,以及是否是借记卡还是贷记卡(信用卡),关键是最后一位校验位。
3751 0
|
安全 Python
(转载)python一句话校验文件哈希值
原文,原创作者: 余弦 懒人在思考 懒人在思考 微信号 lazy-thought 功能介绍 本懒号主要关注点:隐私、攻击、安全开发。
1339 0