Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“按位转换Java”;及;接线员到科特林_Java_Kotlin_Bit Manipulation - Fatal编程技术网

“按位转换Java”;及;接线员到科特林

“按位转换Java”;及;接线员到科特林,java,kotlin,bit-manipulation,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}; }

我有一个字节数组,我正在用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类来获取我正在使用的“byte数组”。所以这两个部分都在同一个输入上运行

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()))
}
fun getKotlinChecksum(数组:ByteArray):字节{
var校验和=0
用于(阵列中的b){
校验和+=(b和0xFF.toByte())
}
返回校验和。toByte()
}
趣味主线(args:Array){
println(Bytes.getJavaChecksum())
打印(getKotlinChecksum(Bytes.getByteArray())
}

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

返回一个
字节
意味着函数无论如何都不能返回128,因此必须是
Int
。Java校验和执行“完整”和,而不仅仅是和的最低字节。类似地,按位AND不能在字节上执行,这是无用的,符号扩展(带0xFF的AND用于删除扩展符号位)仍然会发生。然后可以将其编写为Java风格的循环,但在Kotlin中,编写如下内容可能更有意义:

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