using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CRCTest
{
public partial class CRCForm : Form
{
//参考文献
//https://blog.csdn.net/liyuanbhu/article/details/7882789
private ushort[] Crc16Array ={0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,0x0500,
0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,0x0A00,0xCAC1,
0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,
0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,0x1400,0xD4C1,0xD581,0x1540,
0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,0xF001,
0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,
0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,
0xFB41,0x3900,0xF9C1,0xF881,0x3840,0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,
0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,
0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,
0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,
0xA441,0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,
0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,
0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,
0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,0x5000,0x90C1,0x9181,
0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,
0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,
0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,
0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,
0x8641,0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040};
public CRCForm()
{
InitializeComponent();
}
#region string转byte List
private bool StrToBytes(string sHex, ref List<byte> bytesBuff, ref string sMsg)
{
bool bRet = false;
try
{
if (sHex.Length<2)
{
sMsg = "HexString too short";
return bRet;
}
if ((sHex.Length % 2)!=0)
{
sMsg = "HexString Length should be double";
return bRet;
}
for(int i=0;i< sHex.Length;i++)
{
if (!(char.IsDigit(sHex[i])|| char.IsLetter(sHex[i])))
{
sMsg = "HexString incorrect";
return bRet;
}
if ((i%2)==1)
{
bytesBuff.Add(Convert.ToByte("0x" + sHex[i - 1] + sHex[i],16));
}
}
bRet = true;
}
catch(Exception ex)
{
sMsg = "StrToBytesException:"+ex.Message;
}
return bRet;
}
#endregion
#region CRC校验
private bool CalcCRC16(List<byte> bytesBuff,ref ushort CRCvalue,ref string sMsg)
{
bool bRet = false;
try
{
int nbyte = bytesBuff.Count;
for (int i=0;i< nbyte;i++)
{
byte[] CRCBytes = BitConverter.GetBytes(CRCvalue);
CRCvalue = (ushort)(CRCBytes[1] ^ Crc16Array[bytesBuff[i] ^ CRCBytes[0]]);
}
bRet = true;
}
catch(Exception ex)
{
sMsg = "CalcCRC16Exception:"+ex.Message;
}
return bRet;
}
#endregion
#region 执行
private void btnCrc_Click(object sender, EventArgs e)
{
bool bRet = false;
string sMsg = string.Empty;
try
{
List<byte> byteList = new List<byte>();
bRet = StrToBytes(TBByteText.Text, ref byteList, ref sMsg);
if (!bRet)
{
MessageBox.Show(sMsg);
return;
}
ushort CRCvalue = 0xFFFF;
bRet = CalcCRC16(byteList,ref CRCvalue,ref sMsg);
if (!bRet)
{
MessageBox.Show(sMsg);
return;
}
byte[] CRCBytes = BitConverter.GetBytes(CRCvalue);
TBCRCText.Text = TBByteText.Text + CRCBytes[0].ToString("X2") + CRCBytes[1].ToString("X2");
}
catch(Exception ex)
{
MessageBox.Show("btnCrc_ClickException:"+ex.Message);
}
}
#endregion
}
}
画面部分:
namespace CRCTest
{
partial class CRCForm
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.TBByteText = new System.Windows.Forms.TextBox();
this.TBCRCText = new System.Windows.Forms.TextBox();
this.LBByteText = new System.Windows.Forms.Label();
this.LBCRCText = new System.Windows.Forms.Label();
this.btnCrc = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// TBByteText
//
this.TBByteText.Location = new System.Drawing.Point(126, 27);
this.TBByteText.Name = "TBByteText";
this.TBByteText.Size = new System.Drawing.Size(277, 21);
this.TBByteText.TabIndex = 0;
this.TBByteText.Text = "01";
//
// TBCRCText
//
this.TBCRCText.Location = new System.Drawing.Point(126, 68);
this.TBCRCText.Name = "TBCRCText";
this.TBCRCText.Size = new System.Drawing.Size(277, 21);
this.TBCRCText.TabIndex = 1;
//
// LBByteText
//
this.LBByteText.AutoSize = true;
this.LBByteText.Location = new System.Drawing.Point(65, 27);
this.LBByteText.Name = "LBByteText";
this.LBByteText.Size = new System.Drawing.Size(41, 12);
this.LBByteText.TabIndex = 2;
this.LBByteText.Text = "原报文";
//
// LBCRCText
//
this.LBCRCText.AutoSize = true;
this.LBCRCText.Location = new System.Drawing.Point(65, 77);
this.LBCRCText.Name = "LBCRCText";
this.LBCRCText.Size = new System.Drawing.Size(47, 12);
this.LBCRCText.TabIndex = 3;
this.LBCRCText.Text = "CRC报文";
//
// btnCrc
//
this.btnCrc.Location = new System.Drawing.Point(126, 140);
this.btnCrc.Name = "btnCrc";
this.btnCrc.Size = new System.Drawing.Size(75, 23);
this.btnCrc.TabIndex = 4;
this.btnCrc.Text = "计算CRC";
this.btnCrc.UseVisualStyleBackColor = true;
this.btnCrc.Click += new System.EventHandler(this.btnCrc_Click);
//
// CRCForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(451, 450);
this.Controls.Add(this.btnCrc);
this.Controls.Add(this.LBCRCText);
this.Controls.Add(this.LBByteText);
this.Controls.Add(this.TBCRCText);
this.Controls.Add(this.TBByteText);
this.Name = "CRCForm";
this.Text = "CRC校验";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox TBByteText;
private System.Windows.Forms.TextBox TBCRCText;
private System.Windows.Forms.Label LBByteText;
private System.Windows.Forms.Label LBCRCText;
private System.Windows.Forms.Button btnCrc;
}
}
标签:C#,校验,System,CRC,Windows,new,bRet,btnCrc,Drawing From: https://www.cnblogs.com/530263009QQ/p/18340087