网上找了一段CRC16的验证的代码,不知道如何使用,求调教!
代码如下:
public class CRC
{
public CRC()
{
}
/// <summary>
/// 获取CRC16校验
/// </summary>
/// <param name="data">要进行CRC校验的字节数组</param>
/// <param name="ba">目标字节数组</param>
/// <param name="startPos">在目标字节数组中,存储CRC16校验位的起始字节索引</param>
/// <returns></returns>
public static int GetKey(byte[] data, byte[] ba, int startPos)
{
int count = data.Length;
byte[] buf = new byte[data.Length + 2];
data.CopyTo(buf, 0);
int ptr = 0;
int i = 0;
int crc = 0;
byte crc1, crc2, crc3;
crc1 = buf[ptr++];
crc2 = buf[ptr++];
buf[count] = 0;
buf[count + 1] = 0;
while (--count >= 0)
{
crc3 = buf[ptr++];
for (i = 0; i < 8; i++)
{
if (((crc1 & 0x80) >> 7) == 1)//判断crc1高位是否为1
{
crc1 = (byte)(crc1 << 1); //移出高位
if (((crc2 & 0x80) >> 7) == 1)//判断crc2高位是否为1
{
crc1 = (byte)(crc1 | 0x01);//crc1低位由0变1
}
crc2 = (byte)(crc2 << 1);//crc2移出高位
if (((crc3 & 0x80) >> 7) == 1) //判断crc3高位是否为1
{
crc2 = (byte)(crc2 | 0x01); //crc2低位由0变1
}
crc3 = (byte)(crc3 << 1);//crc3移出高位
crc1 = (byte)(crc1 ^ 0x10);
crc2 = (byte)(crc2 ^ 0x21);
}
else
{
crc1 = (byte)(crc1 << 1); //移出高位
if (((crc2 & 0x80) >> 7) == 1)//判断crc2高位是否为1
{
crc1 = (byte)(crc1 | 0x01);//crc1低位由0变1
}
crc2 = (byte)(crc2 << 1);//crc2移出高位
if (((crc3 & 0x80) >> 7) == 1) //判断crc3高位是否为1
{
crc2 = (byte)(crc2 | 0x01); //crc2低位由0变1
}
crc3 = (byte)(crc3 << 1);//crc3移出高位
}
}
}
ba[startPos] = crc1;
ba[startPos + 1] = crc2;
crc = (int)((crc1 << 8) + crc2);
return crc;
}
public static int GetKey(byte[] data)
{
int count = data.Length;
byte[] buf = new byte[data.Length + 2];
data.CopyTo(buf, 0);
int ptr = 0;
int i = 0;
int crc = 0;
byte crc1, crc2, crc3;
crc1 = buf[ptr++];
crc2 = buf[ptr++];
buf[count] = 0;
buf[count + 1] = 0;
while (--count >= 0)
{
crc3 = buf[ptr++];
for (i = 0; i < 8; i++)
{
if (((crc1 & 0x80) >> 7) == 1)//判断crc1高位是否为1
{
crc1 = (byte)(crc1 << 1); //移出高位
if (((crc2 & 0x80) >> 7) == 1)//判断crc2高位是否为1
{
crc1 = (byte)(crc1 | 0x01);//crc1低位由0变1
}
crc2 = (byte)(crc2 << 1);//crc2移出高位
if (((crc3 & 0x80) >> 7) == 1) //判断crc3高位是否为1
{
crc2 = (byte)(crc2 | 0x01); //crc2低位由0变1
}
crc3 = (byte)(crc3 << 1);//crc3移出高位
crc1 = (byte)(crc1 ^ 0x10);
crc2 = (byte)(crc2 ^ 0x21);
}
else
{
crc1 = (byte)(crc1 << 1); //移出高位
if (((crc2 & 0x80) >> 7) == 1)//判断crc2高位是否为1
{
crc1 = (byte)(crc1 | 0x01);//crc1低位由0变1
}
crc2 = (byte)(crc2 << 1);//crc2移出高位
if (((crc3 & 0x80) >> 7) == 1) //判断crc3高位是否为1
{
crc2 = (byte)(crc2 | 0x01); //crc2低位由0变1
}
crc3 = (byte)(crc3 << 1);//crc3移出高位
}
}
}
crc = (int)((crc1 << 8) + crc2);
return crc;
}
}
不知道这段代码如何使用,CRC16传进去的是什么?丢出来的又是什么?有什么含义?我是第一次接触到CRC16,所以很多东西不懂,因为是新手,对底层的东西也没有那么熟,跪求高手答疑!
[解决办法]
如果你是要CRC16位校验,哪么给你段代码
- C# code
/// <summary> /// CRC16位校验 /// </summary> /// <param name="crc_array">校验数据</param> /// <returns></returns> public uint GetCRC16(Byte[] crc_array) { uint i, j; uint modbus_crc; modbus_crc = 0xffff; for (i = 0; i < crc_array.Length - 2; i++) { modbus_crc = (modbus_crc & 0xFF00) | ((modbus_crc & 0x00FF) ^ crc_array[i]); for (j = 1; j <= 8; j++) { if ((modbus_crc & 0x01) == 1) { modbus_crc = (modbus_crc >> 1); modbus_crc ^= 0XA001; } else { modbus_crc = (modbus_crc >> 1); } } } return modbus_crc; }
[解决办法]
把byte[]代进去就可以了
然后把byte[]+crc值 再代进去 得到crc值为 00 00
表示转换正确