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;
            }
        }
        return Integer.toHexString(crc & 0xffff);
    }
    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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章