[英]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.