ラファ:
私はJavaでのチェックサムを計算していますバイトの配列を持っています。そして、私はKotlinに変換しようとしています。しかし、問題は、計算するときに、私は別の値を取得していますということです-128 & 0xff
、それはKotlinにおける同等のものよりJavaで。-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を使用して、従来のコードベースからのものです。Javaは単に間違っていますか?それとも私がKotlinコードに128を得ることができるという方法はありますか?
ハロルド:
返すByte
関数はニーズがためにそうすることを何、128どんなにを返すことができません手段をInt
。Javaのチェックサムは、「フル」の合計、合計だけでなく、最下位バイトを行います。無用である。同様にビット単位のANDバイトで行うことができない、符号拡張依然として起こる(0xFFを有するANDは、拡張符号ビットを除去することです)。そして、それは、Javaのスタイル、ループのように書くことができますが、Kotlinにそれはおそらくこのような何かを書くために、より理にかなっています:
fun getKotlinChecksum(array: ByteArray): Int {
return array.map({ it.toInt() and 0xFF }).sum()
}