我有一个字节数组,正在为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?
答案 0 :(得分:2)
返回Byte
意味着该函数无论如何都无法返回128,因此必须为Int
。 Java校验和会执行“完整”的总和,而不仅仅是总和的最低字节。同样,按位与不能在字节上完成,这是无用的,符号扩展(与0xFF的与将删除扩展的符号位)仍然会发生。然后可以将其编写为Java风格的循环,但是在Kotlin中编写这样的代码可能更有意义:
fun getKotlinChecksum(array: ByteArray): Int {
return array.map({ it.toInt() and 0xFF }).sum()
}