Я пытаюсь вычислить контрольную сумму файла Sega Genesis rom в Java. Для этого я хочу перенести код, отрезанный от C на Java:Бит-манипуляция 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-код?
Edit: Этот код, кажется, работает, спасибо:
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();
}
Вы можете взять больший целочисленный тип и уменьшить по модулю '0x10000' в каждом раунде цикла. –
Этот код точно такой же в Java. Просто используйте 'unsigned byte []' для указателя 'uint8_t' и' unsigned short' для контрольной суммы. Все остальное - то же самое. –
@JasonCoco: Java не имеет типа unsigned short. –