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. [JSOI2018]军训列队

    [JSOI2018]军训列队 题目大意: \(n(n\le5\times10^5)\)个学生排成一排,第\(i\)个学生的位置为\(a_i\).\(m(m\le5\times10^5)\)次命令,每次 ...

  2. I/O多路复用机制:epoll

    在过去的linux 网络编程中,采用select来做事件触发,其缺点在于每次调用select,都需要把fd集合拷贝到内核,内核必须遍历传递进来的所有fd,这在fd很多时开销会很大,相比于select, ...

  3. win7 64位 php环境开启curl服务Call to undefined function

    无法使用curl_init(),一般情况问题可能出在没有去加载php的扩展文件php_curl.dll(windows操作系统),但是检查了一下系统配置,发现,环境下已经将php.ini文件里 ;ex ...

  4. fedora19/opensuse13.1 配置svn client

    Date: 20140208Auth: Jin 一.install zypper install  subversion yum install  subversion 二.操作 1.将文件check ...

  5. 生成SESSIONID

    生成SESSIONID uses SynCommons procedure TForm1.Button1Click(Sender: TObject);var i: Cardinal;begin i : ...

  6. Ubuntu下Wine使用教程

    转自:http://blog.csdn.net/wangchangshuai0010/article/details/12057251 用了段时间的Ubuntu,感觉很好!可是工作的时候还是要用到 w ...

  7. php根据word模板生成新的word文件

    原文地址:http://www.niu12.com/article/16 php使用phpword将word内容变量替换 a.安装phpword composer require phpoffice/ ...

  8. Android Studio断点调试

    Android Studio断点调试 Android Studio包含一个debugger程序,可以帮助你在模拟器和真机上调试你的android应用.通过Android Studio的debugger ...

  9. RMAN备份与恢复之概念一

    1.  数据库完全备份: 按归档模式分为归档和非归档 归档模式 打开状态,属于非一致性备份 关闭状态,可以分为一致性和非一致性 非归档模式 打开状态,非一致性备份无效 关闭状态,一致性备份,非一致性备 ...

  10. .NET Fframework

    .NET框架示意图: 该框架是微软推出的完全面向对象的软件开发与运行平台.其有两个主要 组将:CLR:公共语言运行库(Common Language Runtime,简称CLR)和.NET Frame ...