╭ᵀˣʷ:D 2022-01-06 15:26 采纳率: 100%
浏览 114
已结题

C语言的字节校验法怎么做?

题目:
通过对数据的特定计算得到校验码并保存;之后可以对该数据重新计算校验码,并与保存的校验码进行核对,来确定该数据是否被破坏或篡改。
字节校验法是数据校验的一种简单方法,将每一个字节的数据视为unsigned char,然后累加(不管是否超界),最终得到一个8位无符号整数,来作为最终的校验码。
编写校验函数unsed char getChksuignm(unsigned char *p, int len),其中unsigned char *p为传入的数据的首地址,int len为该数据以字节为单位的长度。
编写main函数对该函数进行验证,输入你的13位长度的学号(字符型),计算校验码
下面是我的错误想法:

unsigned char getChksum(unsigned char* p, int len)
{
    int sum = 0;
    for (int i = 0; i < len; i++)
    {
        sum += (*p);
        p++;
    }
    return sum;
}
int main()
{
    char num[13];
    gets(num);
    int len = sizeof(num);
    unsigned int ret=getChksum(num, len);
    printf("校验码为:%d", ret);
    return 0;
}

  • 写回答

1条回答 默认 最新

  • Autumn0923 2022-01-06 18:38
    关注

    我看了半天还是没搞懂你这个题目的题意,哈哈哈,抱歉,但是我还是发现了几个问题,假设你的校验码产生函数没有逻辑问题,那你这个代码还是有些地方会出错,首先,你定义的字符串长度就不够,你看字符串的结尾都是要存一个 ‘\0’ 来表示字符串的结束,那13个学号之后再加一个反斜杠零,就是14,也就是最少你这个字符串长度要是14,但是我建议你一般都是稍微大一点点,可能20,或者15都可以,这样可以增加程序的健壮性,比方说谁多输入了一位,你这个程序依旧能够跑起来,在一个就是,你获取字符串长度的时候用的是sizeof,这个就有问题,sizeof得到的是你这个数组的大小,并不是你数组内有效元素的数量,这个你要知道,如果你要获得数组元素个数应该要用strlen这个函数,strlen可以统计字符串中有效字符的个数,也就是反斜杠零前面的,最后一个就是你第16行你的赋值问题,你做了这个操作说明你对函数的理解还不是很到位,一个返回unsign char类型的函数你为什么把他能赋值给一个unsign int类型的变量呢,这里如果不做强制类型转换应该是有问题的,或者说你让ret也变成char类型,但是好像跟题目的要求不太一样,所以建议你做一下强制类型转换,或者改变函数返回类型,你的函数里面也是,你让一个返回 unsign char 类型的函数返回了一个 int 值,建议都修改一下,再学习一下函数方面的知识
    如果有什么问题可以随时私信我

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 1月6日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看