using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CRClib
{
#region 16位CRC校验【CRC】
///
/// 16位CRC校验
///
internal class CRC
{
///
/// CRC校验,返回添加CRC校验码后的字符串
/// 适用于485通讯,用于生成CRC校验码。输入16进制字符串;输出CRC校验码
///
/// 十六进制字符串
/// modbus-CRC校验码
public static String CRCForModbus(string data)
{
//处理数字转换
string sendBuf = data;
string sendnoNull1 = sendBuf.Trim();//去掉字符串前后的空格
string sendnoNull2 = sendnoNull1.Replace(" ", "");//去掉字符串中间的空格
string sendNOComma = sendnoNull2.Replace(',', ' '); //去掉英文逗号
string sendNOComma1 = sendNOComma.Replace(',', ' '); //去掉中文逗号
string strSendNoComma2 = sendNOComma1.Replace("0x", ""); //去掉0x
data = strSendNoComma2.Replace("0X", ""); //去掉0X
Byte[] crcbuf = strToHexByte(data);
//计算并填写CRC校验码
Int32 crc = 0xffff;
Int32 len = crcbuf.Length;
for (Int32 n = 0; n < len; n++)
{
Byte i;
crc = crc ^ crcbuf[n];
for (i = 0; i < 8; i++)
{
Int32 TT;
TT = crc & 1;
crc = crc >> 1;
crc = crc & 0x7fff;
if (TT == 1)
{
crc = crc ^ 0xa001;
}
crc = crc & 0xffff;
}
}
crc = ((crc & 0xFF) << 8 | (crc >> 8));//高低字节换位
String CRCString = crc.ToString("X2");
return (CRCString);
}
///
/// 16进制字符串转字节数组
///
/// 十六进制字符串
/// 返回字节数组
public static Byte[] strToHexByte(String hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
hexString = hexString.Insert(hexString.Length - 1, 0.ToString());
Byte[] returnBytes = new Byte[hexString.Length / 2];
for (Int32 i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
return returnBytes;
}
}
#endregion
}