CRC16算法收集于互联网经过我改善了一下,用法简单,自己留个笔记
//引用命名空间
using System;
using System.Text;
//ASCII码和校验码计算
public static string sumCheckCode(string value){
int sum = 0;
ASCIIEncoding tmpCode = new ASCIIEncoding();
foreach (char val in value.ToCharArray()) {sum += (int)tmpCode.GetBytes(val.ToString())[0];}
string tmpHex = Convert.ToString(sum,16).ToUpper();
switch (tmpHex.Length) {
case 0:
tmpHex = "00";
break;
case 1:
tmpHex = "0" + tmpHex;
break;
default:
tmpHex = tmpHex.Substring(tmpHex.Length - 2,2);
break;
}
return tmpHex;
}
//CRC16校验码计算
public static string CaclCrc16(string dataText)
{
ASCIIEncoding tmpCode = new ASCIIEncoding();
char[] charTmp = dataText.ToCharArray();
int[] intTmp = new int[charTmp.Length];
for (int ii = 0; ii < intTmp.Length; ii++) {
intTmp[ii] = (int)tmpCode.GetBytes(charTmp[ii].ToString())[0]; //转换到10进制ASCII码
}
int xda,xdapoly,i,j,xdabit;xda = 0xFFFF;xdapoly = 0xA001;
for (i = 0; i < intTmp.Length; i++)
{
xda ^= intTmp[i];
for (j = 0; j < 8; j++)
{
xdabit = (int)(xda & 0x01);
xda >>= 1;
if (xdabit == 1)
xda ^= xdapoly;
}
}
string CRC1 = Convert.ToString((int)(xda >> 8),16).ToUpper(); //10进制到16进制
string CRC2 = Convert.ToString((int)(xda & 0xFF),16).ToUpper();//10进制到16进制
switch (CRC1.Length) {case 0:CRC1 = "00";break;case 1:CRC1 = "0" + CRC1;break;}
switch (CRC2.Length) {case 0:CRC2 = "00";break;case 1:CRC2 = "0" + CRC2;break;}
return CRC1 + CRC2;
}