Как вычислить контрольную сумму в Интернете из байта [] в Java

Я пытаюсь выяснить, как вычислить контрольную сумму Internet в Java, и это не дает мне конца боли. (Я ужасно умею манипулировать битами.) Я нашел версию на C # Вычислить Интернет (также известный как IP, aka RFC791) контрольная сумма в C # . Однако моя попытка преобразовать его в 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;
}

16
задан Community 23 May 2017 в 12:34
поделиться