Kotlinの上でのJavaビット単位「と」演算子の変換

ラファ:

私は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どんなにを返すことができません手段をIntJavaのチェックサムは、「フル」の合計、合計だけでなく、最下位バイトを行います。無用である。同様にビット単位のANDバイトで行うことができない、符号拡張依然として起こる(0xFFを有するANDは、拡張符号ビットを除去することです)。そして、それは、Javaのスタイル、ループのように書くことができますが、Kotlinにそれはおそらくこのような何かを書くために、より理にかなっています:

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=189575&siteId=1