将字节数组转换为Int奇数结果Java和Kotlin

时间:2019-07-03 14:49:09

标签: java c# android kotlin

大小为Byte Array的内容如下: {1, 0, 0, 0}。使用1

时,这会转换为C#中的整数BitConverter.ToInt32(bytearray, 0);

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

        var test0 = BigInteger(bytearray).toInt() = 16777216
        var test1 = BigInteger(bytearray).toFloat() = 1.6777216        

   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)
   }

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

4 个答案:

答案 0 :(得分:2)

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

Object id

答案 1 :(得分:1)

这是,

   fun toInt32(bytes:ByteArray):Int {
       if (bytes.size != 4) { 
           throw Exception("wrong len")
       }                   
       bytes.reverse()          
       return ByteBuffer.wrap(bytes).int           
   }

答案 2 :(得分:0)

如@Lother及其its86所建议。

fun littleEndianConversion(bytes: ByteArray): Int
{
    var result = 0
    for (i in bytes.indices)
    {
        if (i == 0)
        {
            result = result or (bytes[i].toInt() shl 8 * i)
        }
        else
        {
            result = result or (bytes[i].toInt() shl 8 * i)
        }
    }
    return result
}

答案 3 :(得分:-1)

在C#中,您拥有以下课程:

export NODE_OPTIONS=--max_old_space_size=8192