Android Kotlin字节移位+ =

时间:2018-09-24 20:50:44

标签: android kotlin byte byte-shifting

我正在尝试将BLE本地字节处理助手转换为Kotlin。在此过程中,我注意到

JAVA

myByteArray[offset] += (byte)(exponent & 0xFF);

它可以按预期工作,但转换为Kotlin后 KOTLIN

myByteArray[offset] += (exponent and 0x0F shl 4).toByte()

我收到预期为整数的错误。 所以我认为

  

“ + =”

是我的问题,导致使用整数。 所以我有两个问题。

1)+ =对字节的确切作用。我了解

  

b + = 1

等价于

  

b =(字节)(b +1)

但是字节到底发生了什么。是在进行移位,还是转换为整数,然后将值相加然后又返回一个字节?

2)Kotlin中的对等之处是什么,为什么Kotlin会失败。我也尝试过

  myByteArray[offset] = myByteArray[offset] + (exponent and 0x0F shl 4).toByte()

记录下来,如果您好奇的话,这是将Integer值转换为32bit Float。不确定是否有帮助。

如果您对此感兴趣,则完整代码为:

mantissa = intToSignedBits(mantissa, 12)
exponent = intToSignedBits(exponent, 4)
myByteArray[offset++] = (mantissa and 0xFF).toByte()
myByteArray[offset] = (mantissa shr 8 and 0x0F).toByte()
myByteArray[offset] += (exponent and 0x0F shl 4).toByte() //hates this line

注意*它表示

  

这个

因为我将其写为ByteArray扩展名,所以可以将其视为byteArray本身。

它的KOTLIN版本(错误)

enter image description here

它的JAVA版本(无错误):

enter image description here

我不仅希望得到一个答案,但我会笑的。我想进一步了解这里发生的事情,以便将来也能自行解决。在此先感谢您抽出宝贵的时间来解释和帮助。

也在我们讨论主题时;)。

  private int unsignedByteToInt(byte b) {
        return b & 0xFF;
   }

为什么这在Java中有效,但在Kotlin中失败。

   private fun unsignedByteToInt(b: Byte): Int {
        return b and 0xFF
   }

老实说,我已经厌倦了编写Java帮助程序类来处理字节的问题,所以我试图找出Kotlin字节处理的习惯用法。 “和”似乎仅对Ints具有重载,并且在Kotlin中字节不被视为Ints。

因此,作为一个奖励问题,如果您能解释一个问题,我也将不胜感激。

2 个答案:

答案 0 :(得分:1)

我相信您应该使用Byte#plus(Byte)

所以在您的情况下:

myByteArray[offset] = myByteArray[offset].plus((exponent and 0x0F shl 4).toByte())
在这种情况下

.toByte()可能不是必需的,因为plus()可以取任何数字,但我无法对其进行测试。

答案 1 :(得分:1)

您是否注意到分解您的陈述有效吗?

val newBytes = (myByteArray[offset]+(exponent and 0x0F shl 4)).toByte()
myByteArray[offset] = newBytes

此行为的罪魁祸首是plus操作员签名。这些都是plus的{​​{1}}的重载:

Byte

这些都不返回/** Adds the other value to this value. */ public operator fun plus(other: Byte): Int /** Adds the other value to this value. */ public operator fun plus(other: Short): Int /** Adds the other value to this value. */ public operator fun plus(other: Int): Int /** Adds the other value to this value. */ public operator fun plus(other: Long): Long /** Adds the other value to this value. */ public operator fun plus(other: Float): Float /** Adds the other value to this value. */ public operator fun plus(other: Double): Double 并且没有plusAssign的重载,因此它们是隐式创建的。

首先它执行Byte返回plus(Byte),然后尝试分配,但是它需要Int,因此会导致您的错误。