【问题标题】:How does this piece of code verify a checksum?这段代码如何验证校验和?
【发布时间】:2016-04-30 21:04:19
【问题描述】:

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

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

在页眉内有一个 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 文件中的页面损坏会很常见吗?

【问题讨论】:

    标签: java checksum robotics


    【解决方案1】:

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

    sum = 0xFF - XOR(file)
    

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

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

    所以预期的结果是:

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

    【讨论】:

    • 必须是一种常见的做法,因为它没有被评论......谢谢:)
    • 我了解 XOR(file) 变为 0xFF 的总和必须为 0x00。但是,我不明白的是你怎么知道校验和是 0x00 事先。如果您不打算在验证时使用它,为什么还要将校验和存储在 page.header 中?
    • @user1534664 您的教授只是利用了一个小技巧,而不是提取它并重做校验和并进行比较。它仍然在不提取的情况下使用,因为如果值不在标头中,则该技巧将不起作用。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 2017-08-20
      相关资源
      最近更新 更多