| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 383 人关注过本帖
标题:c程序纠错 求高手帮忙
取消只看楼主 加入收藏
honney
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-5-16
结帖率:0
收藏
已结贴  问题点数:10 回复次数:2 
c程序纠错 求高手帮忙
这个程序是关于校验的问题 相当于计算机网络里面的crc吧 我这个程序检查好几天了 还是不知道问题出在哪里

注:除数是x1,由于它17位,我把它补成32位来进行计算,由于checksum是16位的,所以可能出现余数17位的情况 ,就将余数的最高位加到了最后一位

还有这程序是在linux环境中运行的 int 占得是4个字节

#include <Stdio.h>
#include <String.h>


typedef struct
{
    char data[16];
    short checksum;
} dataset;                                 /***分组中的16个8位数***/

typedef struct
{
    short flag;
    dataset data[6];
} ft3frame;                                /***ft3帧格式****/

short GetCheckSum(char *data1,int num)     /**校验码计算**/
{
    int i,j,k,x1,x2;
    char temp[18];
    for(i=0;i<num;i++)
        temp[i+2]=data1[i];
    temp[0]=temp[1]=0;
    x1=0x13d65;
    k=num*8-1;                         /**k用来控制移动的次数**/
    do
    {
         x2=(temp[0]<<24)+(temp[1]<<16)+(temp[2]<<8)+temp[3];
         if(x2>=x1)
         {  x2=x2-x1;
            temp[0]=(x2&0xff000000)>>24;         
            temp[1]=(x2&0x00ff0000)>>16;
            temp[2]=(x2&0xff00)>>8;
            temp[3]=(x2&0xff);
          }


      
        
        else
        {
            temp[0]<<=1;
            temp[0]=temp[0]|(temp[1]>>7);  /*小的情况整体移动*/
            for(j=1;j<18;j++)
            {
              temp[j]=temp[j]<<1;
              temp[j]=temp[j]|(temp[j+1]>>7);
            }
            k--;
        }
    }while(k>0) ;
    x2=(temp[2]<<8)+temp[3];
    x2+=temp[1]>>7;
                          
}

short CheckCheckSum(dataset data1)
{
    char temp[18];
    int i,j;
    for(i=0;i<16;i++)
        temp[i]=data1.data[i];
    temp[16]=(data1.checksum&0xff00)>>8;
    temp[17]=(data1.checksum&0xff);
    j=GetCheckSum(temp,18);
    return j;
}

main()
{
    ft3frame ft1;
    unsigned char data[100];
    int i,j,k;
    char *ptr;
    for(i=0;i<100;i++)
    {
        data[i]=i+1;
    }
    k=0;
    for(i=0;i<6;i++)                  /***对ft1帧中的八位数付初值***/
    {
        for(j=0;j<16;j++)
        {
            ft1.data[i].data[j]=data[k];
            k++;
        }
        ft1.data[i].checksum=GetCheckSum(ft1.data[i].data,16);/**每一个分组中**/
        j=CheckCheckSum(ft1.data[i]);                         /**校验码计算**/
        printf("j=%x ",j);
    }
    ft1.flag=0x0564;
    ptr=(char *)&ft1;
    for(i=0;i<100;i++)
    printf("%02x  ",*ptr++);
      
}

真诚希望高手来解决我的问题 ,更加真诚的谢谢
搜索更多相关主题的帖子: 纠错 
2010-05-16 17:30
honney
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-5-16
收藏
得分:0 
我是在linux 下运行的 很奇怪的一个现象 如果我要是不加x2+=temp[1]>>7;他就什么都不显示 很是奇怪 加上后 就好了的

getchecksum 这是校验ft1.data[1]中的data数组的生成的checksum;存在checksum中

程序运行后得出的checksum的结果明显不对 这里算的是用的循环校验码 除数是x1 哦  算法 如计算机网络中的哦

余数应该和x1的位数一样17位 ,可是checksum只有16位,所以就让高位加在最低位了,好像说发生类似的现象都是这样处理的



2010-05-17 11:06
honney
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-5-16
收藏
得分:0 
呜呜 万分火急的东西 怎么没人帮忙啊????
2010-05-18 22:17
快速回复:c程序纠错 求高手帮忙
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039055 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved