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. Java常用小笔记

    1.对list集合进行分页 //startIndex指的是开始的小标 从0开始,pageSize是每页记录数 int toIndex = new Integer(startIndex)+new Int ...

  2. ConstraintLayout导读

    ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能,可以把ConstraintLayout看成是一个更高 ...

  3. Delphi 实现多线程编程的线程类 TThread

    http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉 ...

  4. new placement 的使用

    #include <iostream> #include "TModel.h" int main() { ]; std::cout<<"Sourc ...

  5. Java8新语言特性

    Java8简明指南 欢迎来到Java8简明指南.本教程将一步一步指导你通过所有新语言特性.由短而简单的代码示例,带你了解如何使用默认接口方法,lambda表达式,方法引用和可重复注解.本文的最后你会熟 ...

  6. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  7. Android内存优化5 了解java GC 垃圾回收机制3

    引言 接App优化之内存优化(序), 作为App优化系列中内存优化的一个小部分. 由于内存相关知识比较生涩, 内存优化中使用到的相关工具, 也有很多专有名词. 对Java内存管理, GC, Andro ...

  8. redux状态管理和react-redux的结合使用

    一:调试 注意:Redux调试工具.谷歌中搜redux同理react 新建store的时候判断window.devToolsExtension使用compose(组合函数)结合thunk插件和wind ...

  9. 在SVN中打分支

    项目开发中一个版本号也许就有几次迭代,而完毕一次迭代或一个版本号时,一般会讨论下一步的计划.是否要增加新东西新技术,内部人员是否有变动,这时须要在管理工具中做一些备份,以防我们接下来即使改动serve ...

  10. 动态网站技术CGI

    递信息的规程.CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静三种主流的动态网站技术: ASP JSP PHP 除之外,此还要了解的动态网站技术 ...