奇偶校验算法

snake1234 2007-11-15 01:07:57
具体情况是这样.
有一段数据,不长,大概几百KB吧.
我打算通过奇偶校验的方法,得到一串校验码,长度是数据段长度的1/8.

用C,不使用汇编如何实现呢?数据段长度就算为已知,暂定为800KB,校验码长度为100KB.
大概我的已经写好了,不过不知道有没有更好的方法.来请教各位一下~

如果有好的方法,希望可以共享一下,谢谢^^,有高分相赠.请注意效率问题~
...全文
4747 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Treazy 2007-12-03
  • 打赏
  • 举报
回复
管理帖子->输入密码->给想加分的记录填分数->结贴
snake1234 2007-12-03
  • 打赏
  • 举报
回复
奇怪了,怎么加分的啊。很久没有问过问题了...忘记了!!
snake1234 2007-12-02
  • 打赏
  • 举报
回复
不好意思啊,石头~^^最近工作有点忙,都忘记论坛上的帖子了.
不太清楚石头说的硬件编程是什么意思呢?我对硬件编程不是很了解.可以就这个问题解释一下吗?
_石头_ 2007-11-16
  • 打赏
  • 举报
回复
更快的? 嗯?帮着想想~!
当然,如果搂住愿意的话,用硬件编程很容易就实现了,而且很快!
snake1234 2007-11-16
  • 打赏
  • 举报
回复
差不多,也是CSYNYK(石头)这样写的.不过总琢磨着好象有更快的办法,还在想.
有点犯迷糊了.
_石头_ 2007-11-15
  • 打赏
  • 举报
回复
搂住的意思是这样的吗?譬如:data[0]~data[7] //共8个字节,然后还有一个字节的result[0],data[0]的奇偶校验的结果存放在result[0]的第一位,以此类推,data[7]的奇偶校验的结果存放在result[0]的第8位。这样一出来正好是800k数据,校验结果100k
------是要这么做吗?搂住?
_石头_ 2007-11-15
  • 打赏
  • 举报
回复
整理了一下.

#include <stdio.h>
#include <windows.h>

#define set_bit(x,y) ((x)|=(0x01<<(y))) //置位x的y位

void check(unsigned char *source, unsigned char *result, unsigned int s_len )
{
unsigned char No_bit=0, num=0, tem_re=0, tem_s=0;
while(s_len--)
{
tem_s=*source;
while(tem_s) //计算每个字节中1的个数
{
tem_s&=tem_s-1;
num++;
}
if(num&0x01) //检测每个字节的奇偶
set_bit(tem_re,No_bit);
No_bit++;
if(No_bit>7)
{
No_bit=0;
*result++ =tem_re;
tem_re=0;
}
source++;
num=0;
}

}


int main(void)
{
unsigned char data[]={ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x0e, 0x1e, 0x1e, 0x3e, 0x4e, 0x5e, 0x6e, 0x7e,
0x8e, 0x9e, 0xae, 0xbe, 0xce, 0xde, 0xee, 0xfe,
};
unsigned char *res,d_len=sizeof(data);
res=(unsigned char *)malloc(d_len>>3);
check(data, res, d_len); // 调用校验函数

while(d_len) // 输出校验码数据
{
printf("%d\n",*res++);
d_len-=8;
}
return 0;
}
_石头_ 2007-11-15
  • 打赏
  • 举报
回复
晕,格式怎么乱成这样了?
_石头_ 2007-11-15
  • 打赏
  • 举报
回复
我也来一个!呵呵!

#include <stdio.h>
#include <windows.h>

#define set_bit(x,y) ((x)|=(0x01<<(y))) //置位x的y位

void check(unsigned char *source, unsigned char *result, unsigned int s_len )
{
unsigned char No_bit=0, num=0, tem_re=0, tem_s=0;
while(s_len--)
{
tem_s=*source;
while(tem_s) //计算每个字节中1的个数
{
tem_s&=tem_s-1;
num++;
}
if(num&0x01) //检测每个字节的奇偶
set_bit(tem_re,No_bit);
No_bit++;
if(No_bit>7)
{
No_bit=0;
*result++ =tem_re;
tem_re=0;
}
source++;
num=0;
}
}


int main(void)
{
unsigned char data[]={ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x0e, 0x1e, 0x1e, 0x3e, 0x4e, 0x5e, 0x6e, 0x7e,
0x8e, 0x9e, 0xae, 0xbe, 0xce, 0xde, 0xee, 0xfe };
unsigned char *res,d_len=sizeof(data);
res=(unsigned char *)malloc(d_len>>3);
check(data, res, d_len);
while(d_len)
{
printf("%d\n",*res++); //输出校验码数据
d_len-=8;
}
return 0;
}



Treazy 2007-11-15
  • 打赏
  • 举报
回复
将8个字节的偶校验放入一个字节
实现代码如下


#define set_bit(x,y) ((x)|=(0x01<<(y))) //置位x的y位
#define clr_bit(x,y) ((x)&=(~(0x01<<(y)))) //清零x的y位
#define size(a) (sizeof(a) / sizeof(a[0]))
typedef unsigned char byte;

byte GetEvenVerify(byte bData)
{
byte i; /* 循环控制变量 */
byte bcCount = 0; /* 字节内1的个数 */

for(i = 0; i < 8; i++)
{
if(bData & 0x01)
{
bcCount++;
}
bData >>= 1;
}

return(bcCount & 0x01);
}
int main()
{
byte bData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
byte bVerify[size(bData) / 8 + 1] = {0};
int i, len = size(bData);

for(i = 0; i<len; i++)
{
if(GetEvenVerify(bData[i]))
{
set_bit(bVerify[i/8], i);
}
else
{
clr_bit(bVerify[i/8], i);
}
}
return 0;
}

wjvlangz 2007-11-15
  • 打赏
  • 举报
回复
随便写了一下,看看可不可以,效率可能不高。


#include <stdio.h>

#define DATA_NUM(a) (sizeof(a)/sizeof(a[0]))

unsigned char data[] = {0xac, 3, 4, 5, 8, 9, 3, 7, 1, 4};

unsigned char result[DATA_NUM(data) / 8 + 1];

int main(void)
{
int i;
unsigned char temp;

for (i = 0; i < DATA_NUM(data); i++)
{
temp = data[i];
temp = ((temp & 0xaa) >> 1) ^ (temp & 0x55);
temp = ((temp & 0x44) >> 2) ^ (temp & 0x11);
temp = ((temp & 0x10) >> 4) ^ (temp & 0x01);
result[i / 8] |= (temp << (i % 8));
}

}
tanmeining 2007-11-15
  • 打赏
  • 举报
回复
TO CSYNYK,楼主的意思就是你说的那样...
我是他朋友,我晚上上来抢分,嘿嘿...
mikster 2007-11-15
  • 打赏
  • 举报
回复
0-8 -> checksum[0]
0-16 -> checksum[1]
.
.
.
Treazy 2007-11-15
  • 打赏
  • 举报
回复
>>数据段长度就算为已知,暂定为800KB,校验码长度为100KB

按照楼主的思路应该是对数据以8B为一组算奇偶检验?
那是楼主既定的,不知道你的数据是采集数据,还是其他?

校验算法有很多,对于校验也有很多表达方式
在工业通讯中的比较多的就是用1个字节或2个字节算数据包的奇或偶校验
国外包括国内也有很多用CRC16,CRC32,CRC-CCIT等的校验
还有IECC的校验等等

个人感觉校验还是要根据通讯情况既定
如果数据比较珍贵那就苛刻点,数据不是很重要那就一般的校验就可以!

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧