将 Byte Array 转换为 Int 奇数结果 Java 和 Kotlin

Geo*_*rge 10 c# java android kotlin

大小为 4 的a 的内容Byte Array如下: {1, 0, 0, 0}1使用时这会转换为 C# 中的整数BitConverter.ToInt32(bytearray, 0);

但是,当Integer使用以下代码库将此字节数组转换为 Kotlin 中的 时,我得到的是值16777216而不是 的值1

var test0 = BigInteger(bytearray).toInt() = 16777216
var test1 = BigInteger(bytearray).toFloat() = 1.6777216        
Run Code Online (Sandbox Code Playgroud)

或者

fun toInt32(bytes: ByteArray, index: Int): Int
{
    if (bytes.size != 4) 
        throw Exception("The length of the byte array must be at least 4 bytes long.")

    return 0xff 
        and bytes[index].toInt() shl 56 
        or (0xff and bytes[index + 1].toInt() shl 48) 
        or (0xff and bytes[index + 2].toInt() shl 40) 
        or (0xff and bytes[index + 3].toInt() shl 32)
}
Run Code Online (Sandbox Code Playgroud)

我相信这两种转换方法都是正确的,并且字节值没有签名。

Geo*_*rge 8

正如@Lother 和itsme86 所建议的。

fun littleEndianConversion(bytes: ByteArray): Int {
    var result = 0
    for (i in bytes.indices) {
        result = result or (bytes[i].toInt() shl 8 * i)
    }
    return result
}
Run Code Online (Sandbox Code Playgroud)


and*_*per 5

一个稍微不同的解决方案,我认为它更有效:

    private fun byteToInt(bytes: ByteArray): Int {
        var result = 0
        var shift = 0
        for (byte in bytes) {
            result = result or (byte.toInt() shl shift)
            shift += 8
        }
        return result
    }
Run Code Online (Sandbox Code Playgroud)