繁体   English   中英

我正在尝试计算 C 中 64 位字的 8 位奇偶校验

[英]I am trying to calculate 8-bit parity in a 64-bit word in C

我写了一个小的 function 来计算 64 位字中每个 8 位块的偶校验。 function 产生了不正确的结果。

下面是output for Ukey = 0x666F6F6261723132

错误 Output:

01100110 01101111 01101111 01100010 01100001 01110010 00110001 00110010

正确 Output:

正确偶校验: 01100110 01101111 01101111 01100011 01100000 01110010 00110000 00110011

KEYBITSLEN 定义为 64

BYTELEN 定义为 8

void KeyParity (uint64_t *Ukey)
{
        int ParityBit;
        int i, j;
   
        ParityBit = 0;
   
        for (i = 0; i < KEYBITSLEN; i++)
        {
            for (j = 0; j < BYTELEN; j++)
            {
                if(*(Ukey+i) & (0x01 << j))
                ParityBit = !ParityBit;
            }
            if (i % 8 == 7)
            {
                *(Ukey+i) = ParityBit;
                ParityBit = 0;
            }
        }
}

这一行看起来很可疑:

if(*(Ukey+i) & (0x01 << j))

这条线也是:

*(Ukey+i) = ParityBit;

i != 0时, UKey+i指向一个与Ukey在未定义的 memory 空间中指向的值完全不同的 64 位值。 除非Ukey指向数组的元素,否则这是未定义的行为。

也许这更接近您真正想要的:

uint8_t KeyParity(uint64_t UKey)
{
    uint8_t result = 0;
    bool odd = false;

    for (unsigned int i = 0; i < 64; i++)
    {
        if ((1ULL << i) & UKey)
        {
            odd = !odd;
        }

        if ((i % 8) == 7)
        {
            uint8_t parity = odd ? 1 : 0;
            parity = parity << (i/8);
            result = result | parity;
            odd = false;
        }
    }

    return result;
}

在标题中你要求“64 位字的 8 位奇偶校验”,但在正文中你说“64 位字中每个 8 位块的奇偶校验”。 这是完全不同的两件事。 更糟糕的是,这些都是 8 位值,但是对于 64 位输入,您的“期望输出”是 64 位(这没有意义)。

您可以尝试:

// compute the 8-bit parity of a 64 bit number
uint8_t EightBitParity(uint64_t val) {
    val ^= val >> 32;
    val ^= val >> 16;
    val ^= val >> 8;
    return val & 0xff;
}

// compute parity of each 8-bit byte of a 64-bit number;
uint8_t ParityOfBytes(uint64_t val) {
    val ^= val >> 4;
    val ^= val >> 2;
    val ^= val >> 1;
    val &= 0x0101010101010101;
    val |= val >> 28;
    val |= val >> 14;
    val |= val >> 7;
    return val & 0xff;
}  
    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM