gpt4 book ai didi

java - Java 中的位操作 C 源代码

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

我尝试用 Java 计算 Sega Genesis rom 文件的校验和。为此,我想将从 C 中截取的代码移植到 Java 中:

static uint16 getchecksum(uint8 *rom, int length)
{
int i;
uint16 checksum = 0;

for (i = 0; i < length; i += 2)
{
checksum += ((rom[i] << 8) + rom[i + 1]);
}

return checksum;
}

我明白代码的作用。它将所有 16 位数字相加(由两个 8 位数字组合而成)。但我不明白的是 uint16 的溢出发生了什么以及它如何转移到 Java 代码?

编辑:这段代码似乎可以工作,谢谢:

int calculatedChecksum = 0;
int bufferi1=0;
int bufferi2=0;
bs = new BufferedInputStream(new FileInputStream(this.file));

bufferi1 = bs.read();
bufferi2 = bs.read();
while(bufferi1 != -1 && bufferi2 != -1){
calculatedChecksum += (bufferi1*256 + bufferi2);
calculatedChecksum = calculatedChecksum % 0x10000;
bufferi1 = bs.read();
bufferi2 = bs.read();
}

最佳答案

简单来说就是溢出丢失。更正确的方法(恕我直言)是使用 uint32 进行求和,然后将总和放在低 16 位中,将溢出放在高 16 位中。

关于java - Java 中的位操作 C 源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12168548/

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