JavaでSegaGenesisROMファイルのチェックサムを計算しようとしています。このために、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ビット数を合計します(2つの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();
}