若所求校验为两位ASCII码,LRC就是循环求和后,取256的模,取补码,即为所求校验码;若要四位就改变模值即可
用了两个textbox;
textBox1用于字符输入
textBox2用于处理后输出
button1用于响应
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace encoding
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string original = textBox1.Text; // 从广文本框读入原始数据
// 用于测试的数据 :A0030201C8EE
// 冒号为起始
// A0为设备地址
// 03为控制指令
// 02为数据长度 本测试程序只计算了第二位
// 01C8为数据
// EE为校验码
string[] buf = new string[original.Length];
for (int i = 1; i < original.Length; i++) // 将字符串的第一个字符":"省略
{
buf[i-1] = original.Substring(i, 1);
}
int len =(int)(Convert.ToChar(buf[5]))-48; // 读取数据段长度,为ASCII码,减去48即可.用字符转十进制会更方便
// 此句未测试,用于计算两位的数据长度 int len =((int)(Convert.ToChar(buf[4]))-48)*10+((int)(Convert.ToChar(buf[5]))-48);
int checksum = 0;
for (int i = 0; i < original.Length - 3; i++)
{
checksum += (int)(Convert.ToChar(buf[i])); // 求出校验和为十进制和
}
int sum = 255 - checksum % 256 + 1; // 计算校验和,LRC,ASCII校验
string hex = Convert.ToString(sum, 16).ToUpper(); // 所使用ASCII全部为大写码,共两位,原理不多讲了
string[] buff = new string[hex.Length]; // 分割最后两位的ASCII校验码,用于以后比较
for (int i = 0; i < hex.Length; i++)
buff[i] = hex.Substring(i, 1);
if (buff[0] != buf[6 + len * 2] || buff[1] != buf[7 + len * 2]) // 比较检验码是否正确
{
textBox2.Text = "checksum error" + buf[0] + buf[1];
}
else
{ // 如果校验和正确则显示校验和
textBox2.Text = "you checksum is ok. ";
for (int i = 0; i < len; i++)
{
textBox2.Text += buf[i+6 + len * 2];
}
}
}
}
}