Преобразование Java побитового оператора "и" в Kotlin - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть массив байтов, для которых я вычисляю контрольную сумму в Java. И я пытаюсь преобразовать это в Kotlin. Но проблема в том, что при вычислении -128 & 0xff в Java я получаю другие значения, чем в Kotlin. При прохождении в -128, когда я делаю вычисления в Java, это дает мне положительные 128, но когда я запускаю его в Kotlin, это дает мне -128.

public class Bytes {

    public static byte[] getByteArray() {
        return new byte [] {-128};
    }

    public static int getJavaChecksum() {
        int checksum = 0;

        for (Byte b : getByteArray()) {
            checksum += (b & 0xff);
        }

        return checksum;
    }
}

Это мой код Котлин. Я вызываю вышеуказанный байтовый класс, чтобы получить «байтовый массив», с которым я работаю. Таким образом, обе части работают на одном входе.

fun getKotlinChecksum(array: ByteArray): Byte {
    var checksum = 0
    for (b in array) {
        checksum += (b and 0xFF.toByte())
    }
    return checksum.toByte()
}

fun main(args: Array<String>) {

    println(Bytes.getJavaChecksum())
    print(getKotlinChecksum(Bytes.getByteArray()))
}

Java-код взят из устаревшей кодовой базы, которая использует I2C для отправки этих байтов в микроконтроллер. Ява просто не так? Или есть способ, которым я могу получить 128 в коде Kotlin?

1 Ответ

0 голосов
/ 13 ноября 2018

Возвращение Byte означает, что функция не может вернуть 128, несмотря ни на что, поэтому должно быть Int. Контрольная сумма Java делает «полную» сумму, а не только младший байт суммы. Точно так же побитовое И не может быть выполнено для байтов, то есть бесполезно, расширение знака (И с 0xFF - для удаления битов расширенного знака) все равно будет происходить. Тогда это можно записать в виде цикла в стиле Java, но в Kotlin, вероятно, имеет смысл написать что-то вроде этого:

fun getKotlinChecksum(array: ByteArray): Int {
    return array.map({ it.toInt() and 0xFF }).sum()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...