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. 【斜率优化】bzoj3675-[Apio2014]序列分割&&Uoj104

    题目大意 将一个长度为N的非负整数序列分割成k+l个非空的子序列,每次选择一位置分割后,将会得到一定的分数,这个分数为两个新序列中元素和的乘积.求最大的分数. [UOJ104]并输出任意一种方案 思路 ...

  2. 第一个程序-Hello world

    创建HelloWorld项目 1.在Android Studio的欢迎界面点击Start a new Android Studio project 2.填写Application name(表示应用名 ...

  3. Problem C: 更改大小写

    #include<stdio.h> int main() { ; ]; gets(a); while(a[i]!='\0') { ; ++i; } printf("%s" ...

  4. Linux虚拟化技术KVM、QEMU与libvirt的关系(转)

    说明:个人理解,KVM是内核虚拟化技术,而内核是不能使用在界面上使用的,那么此时QEMU提供了用户级别的使用界面,相互辅助.当然,单独使用QEMU也是可以实现一整套虚拟机,不过QEMU+KVM基本是标 ...

  5. 从connect到express02-中间件morgan

    控制台输出请求日志 输出格式 默认格式: dev, combined, tiny等 自定义格式: morgan(':method :url :status :res[content-length] - ...

  6. 【JSTL】<c:if test=“”>没有else的解决方法

    后台封装了一个对象 放在model里: model.addAttribute("notice", notice); notice是个对象 然后前台如果没有公告的话,希望显示暂无公告 ...

  7. mybatis批量操作-xml方式

    在实际项目中,我们一般都会用到批量insert.delete.update等操作,由于使用频率还是蛮高的,这里就做个简单的记录,供以后学习和参考. 批量insert 在数据库中,批量插入可以是多条in ...

  8. 项目中简单使用ztree,简单数据。

    由于公司架构较旧,使用的jdk版本为1.4,页面上也没有el表达式. 加入 js 文件 <% String context = request.getContextPath(); %> & ...

  9. mongo 误操作恢复数据

    场景:我往同一个集合里面插入 三条数据  aa:aa  bb:bb  cc:cc .后来我后悔了,不想插入 bb:bb,通过oplog重放过滤好 bb:bb这条数据. 原理: 1.通过 oplog.r ...

  10. ylbtech-LanguageSamples-SimpleVariance

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-SimpleVariance 1.A,示例(Sample) 返回顶部 SimpleVar ...