最近在做通訊協議的定義,需要用到校正位,研究了一下同位,發現關於c#的資料很少,就根據原理自己寫了一個,和大家交流一下。
// 功能:示範C#中如何?同位
// 描述:通過對byte進行逐位異或進行同位,此方法效率比較低
// 版本:1.0
// 作者:黑頸
// 部落格:http://zbz.cnblogs.com/
// 網店:http://shop36394998.taobao.com/
using System;
using System.Windows.Forms;
namespace ParityCheck
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
/**//// <summary>
/// 通過對byte進行逐位異或進行同位,此方法效率比較低
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnXor_Click(object sender, EventArgs e)
{
byte bits = Convert.ToByte(txtNumber.Text, 2);
bool bResultOdd = OddParityCheck(bits);
MessageBox.Show("奇數同位結果:" + bResultOdd.ToString());
bool bResultEven = EvenParityCheck(bits);
MessageBox.Show("偶校正結果:" + bResultEven.ToString());
}
/**//// <summary>
/// 對byte逐位異或進行奇數同位並返回校正結果
/// </summary>
/// <param name="AByte">要取bit值的byte,一個byte有8個bit</param>
/// <returns>如果byte裡有奇數個1則返回true,如果有偶數個1則返回false</returns>
private bool OddParityCheck(byte AByte)
{
return getBit(AByte, 0) ^ getBit(AByte, 1) ^ getBit(AByte, 2) ^ getBit(AByte, 3)
^ getBit(AByte, 4) ^ getBit(AByte, 5) ^ getBit(AByte, 6) ^ getBit(AByte, 7);
}
/**//// <summary>
/// 對byte逐位異或進行偶校正並返回校正結果
/// </summary>
/// <param name="AByte">要取bit值的byte,一個byte有8個bit</param>
/// <returns>如果byte裡有偶數個1則返回true,如果有奇數個1則返回false</returns>
private bool EvenParityCheck(byte AByte)
{
return !getBit(AByte, 0) ^ getBit(AByte, 1) ^ getBit(AByte, 2) ^ getBit(AByte, 3)
^ getBit(AByte, 4) ^ getBit(AByte, 5) ^ getBit(AByte, 6) ^ getBit(AByte, 7);
}
/**//// <summary>
/// 取一個byte中的第幾個bit的值,
/// 實在查不到c#有什麼方法,才動手寫了這個函數 -_-#
/// </summary>
/// <param name="AByte">要取bit值的byte,一個byte有8個bit</param>
/// <param name="iIndex">在byte中要取bit的位置,一個byte從左至右的位置分別是0,1,2,3,4,5,6,7</param>
/// <returns>返回bit的值,不知道C#中bit用什麼表示,似乎bool就是bit,就用它來代替bit吧</returns>
private bool getBit(byte AByte, int iIndex)
{
//MessageBox.Show((AByte >> (7 - iIndex) & 1).ToString());
//將要取的bit右移到第一位,再與1與運算將其它位置0
return (AByte >> (7 - iIndex) & 1) != 0 ? true : false;
}
}
}
這種方法是通過對byte進行逐位異或進行同位,效率比較低,現在有另一構思,想通過把所有可能性列出來放進數組裡,查的時候直接在數組中尋找,這樣效率會比較高,下次有時間再貼出來。
差點忘了,放出源碼:
示範C#中如何?同位程式源碼
http://files.cnblogs.com/zbz/SRC/ParityCheck20081101.rar