gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:57:04 24 4
gpt4 key购买 nike

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

Darwin 使用 Motion.bin 文件,其中存储了 256 个页面的列表。每个页面为 512 (8 * 64) 字节,由 7 个步骤(每个步骤 64 字节)加上页头(也是 64 字节)组成。每个步骤包含伺服器要采取的位置(0-4095 之间的值)。因此, Darwin 要移动他的 ARM ,他需要执行 (<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。为什么不直接将计算出的校验和page.header.checksum进行比较呢?

额外问题:为什么首先要检查文件完整性? .bin 文件中的页面损坏是否很常见?

最佳答案

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

sum = 0xFF - XOR(file)

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

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

所以预期的结果是:

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

关于java - 这段代码如何验证校验和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36960242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com