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; }
发表评论