【发布时间】: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。为什么不直接比较计算出的checksum 和page.header.checksum?
额外问题:为什么首先检查文件完整性? .bin 文件中的页面损坏会很常见吗?
【问题讨论】: