加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#实现CRC校验

发布时间:2020-12-15 04:45:35 所属栏目:百科 来源:网络整理
导读:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web; namespace WeChat.CRC{ public class CRC { #region CRC16 public static byte[] CRC16(byte[] data) { int len = data.Length; if (len > 0) { usho

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web;

namespace WeChat.CRC{

public class CRC { #region CRC16 public static byte[] CRC16(byte[] data) { int len = data.Length; if (len > 0) { ushort crc = 0xFFFF;

for (int i = 0; i < len; i++) { crc = (ushort)(crc ^ (data[i])); for (int j = 0; j < 8; j++) { crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1); } } byte hi = (byte)((crc & 0xFF00) >> 8); //高位置 byte lo = (byte)(crc & 0x00FF); //低位置

return new byte[] { hi,lo }; } return new byte[] { 0,0 }; } #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,isReverse); } #endregion

#region ByteToString public static string ByteToString(byte[] arr,bool isReverse) { try { byte hi = arr[0],lo = arr[1]; return Convert.ToString(isReverse ? hi + lo * 0x100 : hi * 0x100 + lo,16).ToUpper().PadLeft(4,'0'); } 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 <= 0 || c >= 127) { 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 > 0 && c < 127) { s.Append((char)c); } } return s.ToString(); }

///

/// 字符串转16进制字符数组 /// /// /// public static byte[] StringToHexByte(string str) { return StringToHexByte(str,false); }

///

/// 字符串转16进制字符数组 /// /// /// /// public static byte[] StringToHexByte(string str,bool isFilterChinese) { string hex = isFilterChinese ? FilterChinese(str) : ConvertChinese(str);

//清除所有空格 hex = hex.Replace(" ",""); //若字符个数为奇数,补一个0 hex += hex.Length % 2 != 0 ? "0" : "";

byte[] result = new byte[hex.Length / 2]; for (int i = 0,c = result.Length; i < c; i++) { result[i] = Convert.ToByte(hex.Substring(i * 2,2),16); } return result; } #endregion }}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读