我正在尝试使用以下代码计算字符串中的奇偶校验位,我首先计算字符串的parityByte然后计算 我收集这些函数的那个字节的parityBit 应该做的伎俩,但我现在不太确定,我使用它们的程序失败了,我想现在,如果它是因为这些或我应该看看其他地方。
char calculateParity(char *payload, int size){
char r = 0;
int i;
for(i = 0; i < size; i++){
r ^= payload[i];
}
return calcParityBit(r);
}
char calcParityBit(char x){
x ^= x >> 8;
x ^= x >> 4;
x ^= x >> 2;
x ^= x >> 1;
return x & 1;
}
答案 0 :(得分:0)
作为@squeamish ossifrage条评论:使用unsigned char
进行计算。由于char
可能已签名,因此右移可能会复制符号位。
此外,代码通常运行效果最佳,返回值为int
与char
。建议使用返回值int
或甚至只是bool
。
// Find parity (of any width up to the width of an unsigned)
int calcEvenParityBit(unsigned par, unsigned width) {
while (width > 1) {
par ^= par >> (width/2);
width -= width/2;
}
// Only return Least Significant Bit
return par % 2;
}
int calculateEvenParity(char *payload, int size) {
unsigned char r = 0;
int i;
for(i = 0; i < size; i++) {
r ^= payload[i];
}
return calcEvenParityBit(r, CHAR_BIT);
}
反转奇校验的结果。
答案 1 :(得分:0)
char calcParityBit (unsigned char v)
{
return (0x6996u >> ((v ^ (v >> 4)) & 0xf)) & 1;
}
这是5次操作而不是7次(在获得@squeamish ossifrage的好建议之后)。
答案 2 :(得分:0)
你必须记住:
1)'x&gt;&gt; a'(int i = 0; i&lt; a; i ++)x / = 2; 因为,如果您使用运算符'&gt;&gt;'对于SIGNED类型,您复制第一位,whitch == 1 in signed types;
2)运营商'&gt;&gt;'和'&lt;&lt;&lt;返回unsigned int值;
(错误示例:unsigned char y =(x&lt;&lt;&lt;&lt;&lt;&lt;&quot;&gt;&gt;&gt; 2; for reset(in 0)两个第一位)
答案 3 :(得分:-1)
你的职能:
char calcParityBit(char x){
x ^= x >> 8;
x ^= x >> 4;
x ^= x >> 2;
x ^= x >> 1;
return x & 1;
}
仅为字节的三位计算奇偶校验。要计算整个8位数的奇偶校验,您可以执行以下操作:
char calcParityBit(char x){
return ( (x>>7) ^
(x>>6) ^
(x>>5) ^
(x>>4) ^
(x>>3) ^
(x>>2) ^
(x>>1) ^
(x) ) & 1;
}
当你坚持使用最低有效位时,如果最有意义的位为'1',你的参数被签名并且右移操作可以用'1'填充移位位这一事实与此解决方案无关(来自你的)
虽然如果标志没有任何实际用途,最好不要使用带号码的号码,并且将号码视为未签名的号码。