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?
返回 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)
| 归档时间: |
|
| 查看次数: |
542 次 |
| 最近记录: |