Crc16 环境212标准的算法。C,Java,c#,python3 语言

C代码

 

unsigned int CRC16_Checkout ( unsigned char *puchMsg, unsigned 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; 
}

 

 

java

 

package testcrc.testcrc;

/**
 * Hello world!
 *
 */


public class App 
{
        public static String calcCrc16(String text) {
        byte[] data = text.getBytes();
        int crc = 0xffff;
        int dxs = 0xa001;
        int hibyte;
        int sbit;
        for (int i = 0; i < data.length; i++) {
            hibyte = crc >> 8;
            crc = hibyte ^ data[i];
            for (int j = 0; j < 8; j++) {
                sbit = crc & 0x0001;
                crc = crc >> 1;
                if (sbit == 1)
                    crc ^= dxs;
            }
        }
        String crcstr=Integer.toHexString(crc & 0xffff);
        if (crcstr.length()<4)
        {
            crcstr="0"+crcstr;
        }
        return crcstr;
    }
    public static void main( String[] args )
    {          
  stmp = "QN=20160801085857223;ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5;CP=&&RtdInterval=30&&";
        System.out.println(calcCrc16(stmp));
       //  1C80
    }
}

 

 

c# de 

 

 

 public string GetCrc16(string tmp)
        {
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(tmp);
            int crcRegister = 0xFFFF;
            for (int i = 0; i < bytes.Length; i++)
            {
                crcRegister = (crcRegister >> 8) ^ bytes[i];
                for (int j = 0; j < 8; j++)
                {
                    int check = crcRegister & 0x0001;
                    crcRegister >>= 1;
                    if (check == 0x0001)
                    {
                        crcRegister ^= 0xA001;
                    }
                }
            }

            string result = string.Format("{0:X}", crcRegister);//转十六进制
            for (int i = result.Length; i < 4; i++)//补足 4 位
            {
                result = "0" + result;
            }

            return result;
        }

 string tmp = "QN=20160801085857223;ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5;CP=&&RtdInterval=30&&";
            string strtmpcrc = GetCrc16(tmp);

  1C80

 

 

python3 的测试正确

 

def crc16(text):
    """

    hj 212-2017 crc16效验

    :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

    return hex(crc)[2:]


if __name__ == '__main__':
    result = crc16('QN=20191015160812988;ST=22;CN=2011;PW=111111;MN=18092222;Flag=5;CP=&&DataTime=20191015160812;a34004-Rtd=15.5;a34002-Rtd=21.7;LA-Rtd=55.4;a01001-Rtd=0.0;a01002-Rtd=0.0;a01007-Rtd=0.0;a01008-Rtd=0;a34001-Rtd=0.0&&')
    result = crc16('QN=20160801085857223;ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5;CP=&&RtdInterval=30&&')
    print(result)

  1C80

 

 

         关于这个CRC, 有的数据 生成的是3位数据, 需要自己是否在前面补零, Java,c#版本是更改补零,python3,c 的目前没环境,没有补充。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值