C#中实现奇偶校验(一)

最近在做通讯协议的定义,需要用到校验位,研究了一下奇偶校验,发现关于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#中如何实现奇偶校验程序源码 

 https://files.cnblogs.com/zbz/SRC/ParityCheck20081101.rar

posted on 2008-11-01 13:59  黑颈  阅读(3567)  评论(0编辑  收藏  举报

导航