首页 > 编程语言 >C# CRC16数据校验支持ModelBus和XMODEM校验模式

C# CRC16数据校验支持ModelBus和XMODEM校验模式

时间:2022-12-02 10:00:54浏览次数:37  
标签:ModelBus redata CRC16 int ++ 校验 crc byte


C# CRC16数据校验支持ModelBus和XMODEM校验模式

最近在研究C# CRC数据校验规则,之前用过ModelBus模式,但是这次的现场用到的是XMODEM模式,写一篇文章记录实现细节,方便后期快速开发!

using System;
using System.Collections.Generic;

namespace Common
{
/// <summary>
/// CRC16 帮助类
/// </summary>
public class CRC16Helper
{
/// <summary>
/// CRC ModelBus校验
/// </summary>
/// <param name="data">校验数据</param>
/// <returns>高低8位</returns>
public static string CRCModelBus(string data)
{
string[] datas = data.Split(' ');
List<byte> bytedata = new List<byte>();

foreach (string str in datas)
{
bytedata.Add(byte.Parse(str, System.Globalization.NumberStyles.AllowHexSpecifier));
}
byte[] crcbuf = bytedata.ToArray();
//计算并填写CRC校验码
int crc = 0xffff;
int len = crcbuf.Length;
for (int n = 0; n < len; n++)
{
byte i;
crc = crc ^ crcbuf[n];
for (i = 0; i < 8; i++)
{
int TT;
TT = crc & 1;
crc = crc >> 1;
crc = crc & 0x7fff;
if (TT == 1)
{
crc = crc ^ 0xa001;
}
crc = crc & 0xffff;
}
}
string[] redata = new string[2];
redata[1] = Convert.ToString((byte)((crc >> 8) & 0xff), 16);
redata[0] = Convert.ToString((byte)((crc & 0xff)), 16);
return data + " " + redata[0] + " " + redata[1];
}

/// <summary>
///CRC ModelBus校验
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static byte[] CRCModelBus(byte[] bytes)
{
//计算并填写CRC校验码
int crc = 0xffff;
int len = bytes.Length;
for (int n = 0; n < len; n++)
{
byte i;
crc = crc ^ bytes[n];
for (i = 0; i < 8; i++)
{
int TT;
TT = crc & 1;
crc = crc >> 1;
crc = crc & 0x7fff;
if (TT == 1)
{
crc = crc ^ 0xa001;
}
crc = crc & 0xffff;
}

}

var nl = bytes.Length + 2;
//生成的两位校验码
byte[] redata = new byte[2];
redata[0] = (byte)((crc & 0xff));
redata[1] = (byte)((crc >> 8) & 0xff);

//重新组织字节数组
var newByte = new byte[nl];
for (int i = 0; i < bytes.Length; i++)
{
newByte[i] = bytes[i];
}
newByte[nl - 2] = (byte)redata[0];
newByte[nl - 1] = redata[1];

return newByte;
}

/// <summary>
/// CRC XMODEM校验模式
/// </summary>
/// <param name="data">数据</param>
/// <param name="size">参与校验的数据长度</param>
/// <returns></returns>
public static UInt16 CRCXMODEM(byte[] data, int size)
{
UInt32 i = 0;
UInt16 crc = 0;
for (i = 0; i < size; i++)
{
crc = UpdateCRC16(crc, data[i]);
}
crc = UpdateCRC16(crc, 0);
crc = UpdateCRC16(crc, 0);
return (UInt16)(crc);
}

/// <summary>
/// 更新RCR16校验
/// </summary>
/// <param name="crcIn"></param>
/// <param name="bytee"></param>
/// <returns></returns>
private static UInt16 UpdateCRC16(UInt16 crcIn, byte bytee)
{
UInt32 crc = crcIn;
UInt32 ins = (UInt32)bytee | 0x100;
do
{
crc <<= 1;
ins <<= 1;
if ((ins & 0x100) == 0x100)
{
++crc;
}
if ((crc & 0x10000) == 0x10000)
{
crc ^= 0x1021;
}
}
while (!((ins & 0x10000) == 0x10000));
return (UInt16)crc;
}
}
}


标签:ModelBus,redata,CRC16,int,++,校验,crc,byte
From: https://blog.51cto.com/u_11295556/5905024

相关文章

  • (笔记)VHDL/Verilog之CRC(循环冗余校验)计算
     背景:我们在使用VHDL或Verilog进行FPGA开发时,经常会遇到CRC校验计算的情况,如校验公式为:G(x)=X8+X4+X3+X2+1G(x)=X3+X+1 那使用VHDL或Verilog语言该如何......
  • SAP ABAP ABVAN保存校验增强
    增强点:CL_FAA_BF_PAR_VAL_ACTIVATION 1IFsy-tcode='ABAVN'ORsy-ucomm='SAVE'.2ASSIGN('(SAPLAMDPS2I)RAIFP2-BUKRS')TO<fs_bukrs>.3IF<fs_buk......
  • SpringBoot参数校验
    1.前言因为网络传输的不可靠性,以及前端数据控制的可篡改性,后端的参数校验是必须的,应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。2.数据校验的......
  • Dubbo RPC基于Filter的自定义参数校验
    在web应用中,我们经常使用注解的方式来校验参数,使得业务开发不用过分关注参数校验的逻辑但是在现有的微服务架构中,常常只是作为一个服务提供rpc服务的方式,那是不是还是退......
  • 身份证校验
    staticstringTestCardId(stringcardId){stringpattern=@"^\d{17}(?:\d|X)$";stringbirth=cardId.Substring(6,8).Insert(6......
  • dojo利用promise实现多个异步校验
    代码如下://敏感词过滤varpromiseAll=checkSenstiveWords();promiseAll.then(function(results){ //console.log("results=>",results) //console.log("v1=>"......
  • LRC校验
    LRC校验纵向冗余校验(LongitudinalRedundancyCheck,简称:LRC)是通信中常用的一种校验形式,也称LRC校验或纵向校验。它是一种从纵向通道上的特定比特串产生校验比特的错误检测......
  • 【最终方法】百度移动适配 url校验不通过的解决方法,URL适配规则
    现在网站除了有pc站外,同时相对应的也有手机站,手机站有时百度识别不是很好,这时我们需要使用百度移动适配,进行调节让自己的pc站和手机站进行匹配到,但是很多网友却发现在适配......
  • 订单校验组件设计
    主要关键类/接口介绍Validator  校验器,定义的是一个具体的校验规则;1.Rule规则,是对一个具体规则的描述,包含校验具体的是哪个字段,用的什么校验器,校验错误的代码、错误描述......
  • groovy语法校验和沙盒(sandbox)运行
    groovy语法校验主要解决脚本在编写时能实时检查语法是否正确,类似IDE的功能,沙盒运行主要解决系统若嵌入System.exit(0),会导致整个应用停掉的问题需要引用的依赖包如下:<!--ht......