这段代码如何验证校验和?

时间:2016-04-30 21:04:19

标签: java checksum robotics

上下文 我的老师将Darwin-OP框架从C ++移植到Java,允许像我这样的学生使用它而无需掌握C ++。 Darwin有两个控制器:主控制器运行Linux并运行java代码,并与子控制器(微控制器)串行连接,控制所有传感器/伺服/传感器等。

Darwin使用motion.bin文件,其中存储256页的列表。每页为512(8 * 64)字节,由7个步骤(每个64字节)加上页面标题(也是64字节)组成。每个步骤包含伺服采用的位置(0-4095之间的值)。因此,为了达尔文移动他的手臂,他经过(< 7)步骤直到他完成最后一步。

页眉内部有一个1字节的校验和。 Java代码包含两种计算和验证校验和的方法:

private static boolean VerifyChecksum(PAGE page) {
    byte checksum = (byte)0x00;
    byte[] pagebytes = page.GetBytes();
    for (int i = 0; i < pagebytes.length; i++) {
        checksum += pagebytes[i];
    }
    if (checksum != (byte)0xFF) {
        return false;
    }
    return true;
}

private static void SetChecksum(PAGE page) {
    byte checksum = (byte)0x00;
    byte[] pagebytes = page.GetBytes();
    page.header.checksum = (byte)0x00;
    for (int i = 0; i < pagebytes.length; i++) {
        checksum += pagebytes[i];
    }
    page.header.checksum = (byte)((byte)0xFF - checksum);
} 

主要问题:有人可以解释校验和是如何验证的吗?我不明白为什么会检查checksum != (byte)0xFF。为什么不将计算出的checksumpage.header.checksum进行比较?

奖金问题:为什么要首先检查文件的完整性? .bin文件中的页面是否会被破坏?

2 个答案:

答案 0 :(得分:2)

要计算校验和,请对文件中的所有字节执行XOR,然后返回0xFF减去该值。
传入校验和方法的文件是校验和位置为0x00的最终文件。

sum = 0xFF - XOR(file)

对于二进制,加法与XOR相同,因此行checksum += pagebytes[i];

您教授的验证方法将对整个文件进行异或。也就是说,校验和方法的原始参数,以及校验和方法输出的附加字节。

那么预期的结果就是:

XOR(file, sum)
= XOR(file) + sum
= XOR(file) + 0xFF - XOR(file)
= 0xFF

答案 1 :(得分:0)

假设标题是页面的一部分。然后计算所有字节x的总和并将255-x存储为校验和。验证时,计算y + 255 - x必须等于255.如果是,则x和y是相同的数字。

请注意,所有计算都以256为模进行,因此x和y始终在0到255的范围内。