将Java按位“和”运算符转换为Kotlin

时间:2018-11-13 00:12:40

标签: java kotlin bit-manipulation

我有一个字节数组,正在为Java计算一个校验和。我正在尝试将其转换为Kotlin。但是问题是,在Java中计算-128 & 0xff时,我得到的值不同于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;
    }
}

这是我的Kotlin代码。我正在调用上述bytes类来获取正在使用的“字节数组”。因此,这两部分都在同一输入上运行。

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将这些字节发送到微控制器的旧版代码库。 Java只是错了吗?还是有办法让我在Kotlin代码中获得128?

1 个答案:

答案 0 :(得分:2)

返回Byte意味着该函数无论如何都无法返回128,因此必须为Int。 Java校验和会执行“完整”的总和,而不仅仅是总和的最低字节。同样,按位与不能在字节上完成,这是无用的,符号扩展(与0xFF的与将删除扩展的符号位)仍然会发生。然后可以将其编写为Java风格的循环,但是在Kotlin中编写这样的代码可能更有意义:

fun getKotlinChecksum(array: ByteArray): Int {
    return array.map({ it.toInt() and 0xFF }).sum()
}