1. 封装一个静态类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks; namespace TestApp
    {
    public class CRC
    { #region CRC16
    public static byte[] CRC16(byte[] data)
    {
    int len = data.Length;
    if (len > )
    {
    ushort crc = 0xFFFF; for (int i = ; i < len; i++)
    {
    crc = (ushort)(crc ^ (data[i]));
    for (int j = ; j < ; j++)
    {
    crc = (crc & ) != ? (ushort)((crc >> ) ^ 0xA001) : (ushort)(crc >> );
    }
    }
    byte hi = (byte)((crc & 0xFF00) >> ); //高位置
    byte lo = (byte)(crc & 0x00FF); //低位置 return new byte[] { hi, lo };
    }
    return new byte[] { , };
    }
    #endregion #region ToCRC16
    public static string ToCRC16(string content)
    {
    return ToCRC16(content, Encoding.UTF8);
    } public static string ToCRC16(string content, bool isReverse)
    {
    return ToCRC16(content, Encoding.UTF8, isReverse);
    } public static string ToCRC16(string content, Encoding encoding)
    {
    return ByteToString(CRC16(encoding.GetBytes(content)), true);
    } public static string ToCRC16(string content, Encoding encoding, bool isReverse)
    {
    return ByteToString(CRC16(encoding.GetBytes(content)), isReverse);
    } public static string ToCRC16(byte[] data)
    {
    return ByteToString(CRC16(data), true);
    } public static string ToCRC16(byte[] data, bool isReverse)
    {
    return ByteToString(CRC16(data), isReverse);
    }
    #endregion #region ToModbusCRC16
    public static string ToModbusCRC16(string s)
    {
    return ToModbusCRC16(s, true);
    } public static string ToModbusCRC16(string s, bool isReverse)
    {
    return ByteToString(CRC16(StringToHexByte(s)), isReverse);
    } public static string ToModbusCRC16(byte[] data)
    {
    return ToModbusCRC16(data, true);
    } public static string ToModbusCRC16(byte[] data, bool isReverse)
    {
    return ByteToString(CRC16(data), isReverse);
    }
    #endregion #region ByteToString
    public static string ByteToString(byte[] arr, bool isReverse)
    {
    try
    {
    byte hi = arr[], lo = arr[];
    return Convert.ToString(isReverse ? hi + lo * 0x100 : hi * 0x100 + lo, ).ToUpper().PadLeft(, '');
    }
    catch (Exception ex) { throw (ex); }
    } public static string ByteToString(byte[] arr)
    {
    try
    {
    return ByteToString(arr, true);
    }
    catch (Exception ex) { throw (ex); }
    }
    #endregion #region StringToHexString
    public static string StringToHexString(string str)
    {
    StringBuilder s = new StringBuilder();
    foreach (short c in str.ToCharArray())
    {
    s.Append(c.ToString("X4"));
    }
    return s.ToString();
    }
    #endregion #region StringToHexByte
    private static string ConvertChinese(string str)
    {
    StringBuilder s = new StringBuilder();
    foreach (short c in str.ToCharArray())
    {
    if (c <= || c >= )
    {
    s.Append(c.ToString("X4"));
    }
    else
    {
    s.Append((char)c);
    }
    }
    return s.ToString();
    } private static string FilterChinese(string str)
    {
    StringBuilder s = new StringBuilder();
    foreach (short c in str.ToCharArray())
    {
    if (c > && c < )
    {
    s.Append((char)c);
    }
    }
    return s.ToString();
    } /// <summary>
    /// 字符串转16进制字符数组
    /// </summary>
    /// <param name="hex"></param>
    /// <returns></returns>
    public static byte[] StringToHexByte(string str)
    {
    return StringToHexByte(str, false);
    } /// <summary>
    /// 字符串转16进制字符数组
    /// </summary>
    /// <param name="str"></param>
    /// <param name="isFilterChinese">是否过滤掉中文字符</param>
    /// <returns></returns>
    public static byte[] StringToHexByte(string str, bool isFilterChinese)
    {
    string hex = isFilterChinese ? FilterChinese(str) : ConvertChinese(str); //清除所有空格
    hex = hex.Replace(" ", "");
    //若字符个数为奇数,补一个0
    hex += hex.Length % != ? "" : ""; byte[] result = new byte[hex.Length / ];
    for (int i = , c = result.Length; i < c; i++)
    {
    result[i] = Convert.ToByte(hex.Substring(i * , ), );
    }
    return result;
    }
    #endregion }
    }
  2. 调用测试
      static void Main(string[] args)
    {
    string msg = "01 2C 00 00 00 00 00 00 0A 4F 4F 05 93 00 07 06 15 00 00 00 23 3D F5 7C 45 71 20 00 45 71 20 00 00 00 00 00 40 DF 70 E3 00 00 00 00 BF 8F D6 63 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00 23 3D F9 00 45 71 20 00 45 71 20 00 00 00 00 00 00 00 00 00 00 00 00 00 BF 8E 47 99 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00 23 3D FC 84 45 71 20 00 45 71 20 00 00 00 00 00 00 00 00 00 00 00 00 00 BF 8A FD 76 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00 23 3E 00 08 45 71 20 00 45 71 20 00 00 00 00 00 00 00 00 00 00 00 00 00 BF 92 C7 B9 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00 23 3E 03 8C 45 71 20 00 45 71 20 00 00 00 00 00 00 00 00 00 00 00 00 00 BF 8A A4 FD 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00 23 3E 07 10 45 71 20 00 45 71 20 00 00 00 00 00 00 00 00 00 00 00 00 00 BF 8D EE CC 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00 23 3E 0A 94 45 71 20 00 45 71 20 00 00 00 00 00 00 00 00 00 00 00 00 00 BF 88 38 B0 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00 23 3E 0E 18 45 71 40 00 45 71 50 00 00 00 00 00 41 1F D4 4B 00 00 00 00 BF 7C 04 97 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00 23 3E 11 9C 45 71 70 00 45 71 70 00 00 00 00 00 41 15 7B 74 00 00 00 00 BF 8E A0 12 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00 23 3E 15 20 45 71 90 00 45 71 90 00 00 00 00 00 40 E1 D9 FE 00 00 00 00 BF 8C E5 0D 00 00 00 00 00 00 00 00 10 20 00 00 41 30 00 00";
    var a = CRC.ToCRC16(msg, true); //结果为:
    var b = CRC.ToCRC16(msg, false); //结果为:
    var c = CRC.ToModbusCRC16(msg, true); //结果为:
    var e = CRC.ToModbusCRC16(msg, false);
    var d = CRC.ToCRC16("你好,我们测试一下CRC16算法", true); //结果为:
    }

    完成。

crc16 校验算法 C#的更多相关文章

  1. JS写的CRC16校验算法

    var CRC = {}; CRC.CRC16 = function (data) { var len = data.length; if (len > 0) { var crc = 0xFFF ...

  2. JS写的CRC16校验算法(查表法)

    var CRC = {}; CRC._auchCRCHi = [ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0 ...

  3. Delphi CRC16校验算法实现(转)

    循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC值并随 ...

  4. Python CRC16校验算法

    def crc16(x, invert): a = 0xFFFF b = 0xA001 for byte in x: a ^= ord(byte) for i in range(8): last = ...

  5. 【转】crc16几种标准校验算法及c语言代码

    一.CRC16校验码的使用 现选择最常用的CRC-16校验,说明它的使用方法. 根据Modbus协议,常规485通讯的信息发送形式如下: 地址 功能码 数据信息 校验码 1byte 1byte nby ...

  6. PHP CRC16 校验码的算法怎么使用

    PHP CRC16 校验码的算法如何使用最近用到CRC16, 我现在就是要把 010301180001 算出CRC16的校验码,通过其他工具,可以得到 校验码是 05F1 最后完整的代码就是 0103 ...

  7. Java CRC16 MODBUS校验算法实现

    /** * CRC校验算法工具类 */ public class CRCUtil { public static String getCRC(String data) { data = data.re ...

  8. 查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

  9. CRC-16校验C#代码

    [csharp] view plaincopyprint? using System; using System.Collections.Generic; using System.Text; usi ...

随机推荐

  1. 【c++随手记】编程基础之输入输出

    今天试了下noi oj的1.1节,随便总结一下. [cout左对齐右对齐的方法] #include<iostream> #include<cstdio> #include< ...

  2. 分页器与form表单

    分页器 分页器对象 from django.core.paginator import Paginator Paginator对象: paginator = Paginator(user_list, ...

  3. 1.1(JavaScript学习笔记)、JavaScript基础

    一.JavaScript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型. 它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端 ...

  4. 二叉搜索树BStree

    二叉搜索树,实际上是有点类似于二分查找.实际上很简单,就是递归.直接上代码,有点要注意的就是删除的时候,如果是左子树和右子树都存在的话,要寻找继承者(successor). import java.u ...

  5. Java高级架构师(一)第34节:Nginx的Http模块部分的指令

    默认长链接的数目在100个 默认长链接的超时时间,一般在75S.

  6. [转]Spring Security学习总结二

    原文链接: http://www.blogjava.net/redhatlinux/archive/2008/08/20/223148.html http://www.blogjava.net/red ...

  7. php应用数据库连接中的单例模式

    所谓的单例模式简而言之就是某个类在运行过程中只有一个实例,并且能够自行实例化并为整个系统的运行提供这个实例.在数据库连接中使用单例模式实例化数据库连接对象主要是可以避免重复的实例化对象而造成资源的浪费 ...

  8. 使用参数化查询防止SQL注入漏洞

    参数化查询防止SQL注入漏洞 看别人的登录注册sql语句有没漏洞即可 Where  name=‘admin’ or ‘1=1’ and password=’123’; 可以Or ‘1=1’就是漏洞 h ...

  9. bootstrap之双日历时间段选择控件示例—daterangepicker(中文汉化版)

    效果图: 参考代码: <link href="/css/daterangepicker.min.css?ver=0.6" rel="stylesheet" ...

  10. 性能工具TProfiler介绍文档

    工具介绍 TProfiler是一个可以在生产环境长期使用的性能分析工具.它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点 对象创建热点 线程状态分析等数据,为查找系统性能瓶颈提供数 ...