代码之家  ›  专栏  ›  技术社区  ›  Sam

Android Kotlin字节移位+=

  •  0
  • Sam  · 技术社区  · 6 年前

    JAVA

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

    它按预期工作,但当转换为kotlin时 科特林

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

    我得到了一个期望整数的错误。 所以我假设

    "+="

    是我的问题,并导致假定一个整数。

    等于

    b=(字节)(b+1)

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

    2) 什么是科特林的等价物,为什么它在科特林失败。我也试过了

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

    作为记录,如果您好奇的话,这是将整数值转换为32位浮点值。不确定这是否有帮助。

    如果您对此感兴趣,完整的代码是:

    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
       }
    

    所以作为一个额外的问题,如果你能解释一下,我也会很感激的。

    2 回复  |  直到 6 年前
        1
  •  1
  •   TheWanderer    6 年前

    我认为你应该用 Byte#plus(Byte) .

    所以在你的情况下:

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

    .toByte() 在这种情况下可能没有必要,因为 plus() 基本上取任何数字,但我无法测试。

        2
  •  1
  •   Pawel    6 年前

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

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

    这种行为的罪魁祸首是 plus 操作员签名。这些都是超负荷的 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 ,因此它们是隐式创建的。

    首先它执行 plus(Byte) 返回 Int 然后尝试赋值,但它需要一个 所以它导致了你的错误。