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

Raf*_*afa 5 java bit-manipulation kotlin

我有一个字节数组,我正在计算 Java 中的校验和。我正在尝试将其转换为 Kotlin。但问题是,在计算-128 & 0xffJava 中的时,我得到的值与 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 Kotlin 代码。我正在调用上面的字节类来获取我正在使用的“字节数组”。所以这两个部分都在同一个输入上运行。

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()))
}
Run Code Online (Sandbox Code Playgroud)

Java 代码来自使用 I2C 将这些字节发送到微控制器的遗留代码库。Java 只是错了吗?或者有没有办法在 Kotlin 代码中获得 128?

har*_*old 3

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

fun getKotlinChecksum(array: ByteArray): Int {
    return array.map({ it.toInt() and 0xFF }).sum()
}
Run Code Online (Sandbox Code Playgroud)