我正在尝试将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版本(错误)
它的JAVA版本(无错误):
我不仅希望得到一个答案,但我会笑的。我想进一步了解这里发生的事情,以便将来也能自行解决。在此先感谢您抽出宝贵的时间来解释和帮助。
也在我们讨论主题时;)。
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。
因此,作为一个奖励问题,如果您能解释一个问题,我也将不胜感激。
答案 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
,因此会导致您的错误。