Я пытаюсь выяснить, как вычислить контрольную сумму в Интернете на Java, и это не причиняет мне боли. (Я ужасен при манипуляции бит.) Я нашел версию в С# Вычислить контрольную сумму Интернета (так же IP, aka RFC791) в С#. Однако моя попытка конвертировать его в Java не позволяет получить правильные результаты. Может ли кто-нибудь увидеть, что я делаю неправильно? Я подозреваю, что проблема с типом данных.
public long getValue() {
byte[] buf = { (byte) 0xed, 0x2A, 0x44, 0x10, 0x03, 0x30};
int length = buf.length;
int i = 0;
long sum = 0;
long data = 0;
while (length > 1) {
data = 0;
data = (((buf[i]) << 8) | ((buf[i + 1]) & 0xFF));
sum += data;
if ((sum & 0xFFFF0000) > 0) {
sum = sum & 0xFFFF;
sum += 1;
}
i += 2;
length -= 2;
}
if (length > 0) {
sum += (buf[i] << 8);
// sum += buffer[i];
if ((sum & 0xFFFF0000) > 0) {
sum = sum & 0xFFFF;
sum += 1;
}
}
sum = ~sum;
sum = sum & 0xFFFF;
return sum;
}