c#关于十六进制字符容错的问题请教

.Net技术 码拜 9年前 (2015-05-10) 1050次浏览 0个评论

整行读取160个字节,只要等于特定的规则字符串,就将其输出,允许一比特的容错率,如何实现?想法就行。

例如:规则字符串为:00 08 0E 32 30……       允许1比特的容错   
            输入字符串为:00 08 0E 32 30……满足要求   为01 08 0E 32 30……也满足要求

但是如果将所有可能的情况都设为规则的话,160个字节的种类就不计其数了,具体应该怎么实现?求指教。

允许1比特的容错 是啥意思?
bit 
还是byte?
30分
void Main()
{
    byte[] data = { 0x00, 0x08, 0x0E, 0x32, 0x30 };
    byte[] bs1 = new byte[160]; data.CopyTo(bs1, 0); 
    byte[] bs2 = new byte[160]; data.CopyTo(bs2, 0);

    bs2[0] = 0x01;
    bool ok1 = Check(bs1, bs2);  // true

    bs2[0] = 0x03;
    bool ok2 = Check(bs1, bs2);  // false
}

static bool Check(byte[] bs1, byte[] bs2, int tolerance = 1)
{
    if (bs1.Length != bs2.Length) return false;
    Func<byte, int> countBit = b =>
    {
        return Enumerable.Range(0, 8).Sum(i => (b & (1 << i)) > 0 ? 1 : 0);
    };
    int errorCount = bs1.Zip(bs2, (x, y) => (byte)(x ^ y)).Sum(b => countBit(b));
    return errorCount <= tolerance;
}
30分
^符号在C#中为XOR,中文为‘异或’,XOR两个bit,当他们不相等就得到1:
1 ^ 1 = 0
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
因此,把两个字节串进行异或,并统计bit==1的数量,就得到误码的数量。
20分
转换成十进制整数,如
Convert.ToInt16(“FF”, 16)
Convert.ToInt32(“FF”, 16)

异或后转乘二进制表示,并删除 “0”,统计“1”的个数。如
Convert.ToString(32 ^ 33, 2).Replace(“0”, “”).Count()

20分
            var a = "00 08 0E 32 30";
            var b = "01 08 0E 32 30";
            var a1 = a.Split(new char[1]{"" ""});
            var b1 = b.Split(new char[1]{"" ""});
            var sum = 0;
            for(int i=0; i<a1.Count(); i++)
            {
                sum += Convert.ToString(Convert.ToInt32(a1[i], 16) ^ Convert.ToInt32(b1[i], 16), 2).Replace("0", "").Count();
            }
            Console.WriteLine(sum);

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c#关于十六进制字符容错的问题请教
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!