【发布时间】:2018-10-25 01:20:00
【问题描述】:
使用 c 中的程序读取文件,然后我必须为程序执行 8 位和 16 位校验和。到目前为止,我只完成了 8 位校验和。
这是我理解的
我读取文件并将信息存储在一个字符数组中,最后它采用换行符。所以例如计算 8 位校验和,这就是本质上发生的事情
文件共有 3 个字母(3 个 a 和一个换行符)
所以数组包含 4 个字符 aaa+(newline) (97+97+97+10)
据我了解,我将所有字节添加到数组中,然后执行 % 256,这就是我的校验和。
97 * 3 = //3 a's (small a) 从我理解的 ascii 表中提取
291 + 10 = 301 // + 换行符
301 % 256 = cc 十六进制 //
但是我对如何计算 16 位校验和感到困惑,因为如果它是单个字符数组,我不能一次添加 2 个字符?
任何帮助将不胜感激
【问题讨论】:
-
我讨厌用问题来回答问题,但为什么是 256?这个数字有什么意义?在检查 16 位时会有什么不同?此外,301 是一个不适合单个字节的数字。这让我想到了unsigned overflow and modulo operations。
-
这是一个简单的校验和算法,还是任何其他修改?这从描述中不清楚。对于简单的校验和只需使用
sum & 0xffff或(unsigned short)sum(其中unsigned short表示16 位无符号整数) 或sum % 65536,如果你喜欢(但我不推荐这最后一个选项;并不是说会有不同的结果,但我认为最好使用&或重新输入以获得更好的可读性)。当然,只有在这是作业时才使用 sum;认真使用select another hash algorithm.