gpt4 book ai didi

java - 将 Java 按位 "and"运算符转换为 Kotlin

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:09 26 4
gpt4 key购买 nike

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

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 将这些字节发送到微 Controller 的遗留代码库。 Java是错的吗?或者有没有办法在 Kotlin 代码中获取 128?

最佳答案

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

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

关于java - 将 Java 按位 "and"运算符转换为 Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53271952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com