“按位转换Java”;及;接线员到科特林
我有一个字节数组,我正在用Java计算校验和。我想把它转换成Kotlin。但问题是,在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}; }
-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()
}