C# CRC-16(循环冗余错误校验) 基于Modbus

loveSoftandhxy 2010-09-04 08:07:06
最近在搞C# CRC-16(循环冗余错误校验) 基于Modbus,发现网上很多,不是很适用自己。没办法,得不到自己想要的结果。
所以来这里请教大家:

字符串:0x01,0x03,0x04,0x44,0x99,0x9E,0x14
CRC校验后是:0x56 0x83
当前值是:1228.94

希望大家帮忙看看啊,得到正确的结果,网上的都差不多尝试过了。不行。我下了个CRC的工具就可以,但是是别的语言的。我不会转换,请大家帮忙!!!不甚感激!!! 在线等!!!!!!!

一个工具的部分源码:
这个方法蛮好的,下面是直接生成的,不是通过表。
unsigned short crc_16(unsigned char *Array, unsigned char *Rcvbuf,unsigned int Len)
{
unsigned int IX,IY,CRC;
CRC=0xFFFF;//set all 1

if (Len<=0)
CRC = 0;
else
{
Len--;
for (IX=0;IX<=Len;IX++)
{
CRC=CRC^(unsigned int)(Array[IX]);
for(IY=0;IY<=7;IY++)
{
if ((CRC&1)!=0 )
CRC=(CRC>>1)^0xA001;
else
CRC=CRC>>1; //
}
}

}
Rcvbuf[0] = (CRC & 0xff00)>>8;//高位置
Rcvbuf[1] = (CRC & 0x00ff); //低位置

CRC= Rcvbuf[0]<<8;
CRC+= Rcvbuf[1];
return CRC;
}
...全文
469 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bloodish 2010-09-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lovesoftandhxy 的回复:]
引用 2 楼 bloodish 的回复:
C# code

static void Main(string[] args)
{
byte[] data = { 0x01, 0x03, 0x04, 0x44, 0x99, 0x9E, 0x14 };
ushort crc = crc_16(data);
Console.WriteLine("c……



谢谢你的回答。答案结果页……
[/Quote]
CRC的算法很多,不同的算法会返回不同的CRC值,
如果要怀疑就要去怀疑你的算法是否正确,否则只要你不同的data输入得到唯一的crc值就没问题.
loveSoftandhxy 2010-09-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bloodish 的回复:]
C# code

static void Main(string[] args)
{
byte[] data = { 0x01, 0x03, 0x04, 0x44, 0x99, 0x9E, 0x14 };
ushort crc = crc_16(data);
Console.WriteLine("c……
[/Quote]


谢谢你的回答。答案结果页是正确的。


但是:为什么有的校验和工具还是不一样呢????
比如:01 03 04 41 A3 85 1F
在工具中校验结果是: 0x3C 0x92

用程序结果是:0x753d

????????????????????????????请帮忙看看好吗?不知道怎么回事?
bloodish 2010-09-04
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
byte[] data = { 0x01, 0x03, 0x04, 0x44, 0x99, 0x9E, 0x14 };
ushort crc = crc_16(data);
Console.WriteLine("crc=0x{0:x}", crc);
//输出结果
//crc=0x8356
}

static ushort crc_16(byte[] data)
{
uint IX, IY;
ushort crc = 0xFFFF;//set all 1

int len = data.Length;
if (len <= 0)
crc = 0;
else
{
len--;
for (IX = 0; IX <= len; IX++)
{
crc = (ushort)(crc ^ (data[IX]));
for (IY = 0; IY <= 7; IY++)
{
if ((crc & 1) != 0)
crc = (ushort)((crc >> 1) ^ 0xA001);
else
crc = (ushort)(crc >> 1); //
}
}
}

byte buf1 = (byte)((crc & 0xff00) >> 8);//高位置
byte buf2 = (byte)(crc & 0x00ff); //低位置

crc = (ushort)(buf1 << 8);
crc += buf2;
return crc;
}

loveSoftandhxy 2010-09-04
  • 打赏
  • 举报
回复
???高手呢?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧