若所求校正為兩位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]; } } } }}