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