Android Kotlin Byte Shifting + = - PullRequest
       35

Android Kotlin Byte Shifting + =

0 голосов
/ 24 сентября 2018

Я пытаюсь преобразовать собственный помощник по обработке байтов 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()

Для записи это преобразование целочисленного значения в 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

ПРИМЕЧАНИЕ * В нем говорится

this

потому что я написал его как расширение 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, а байты не рассматриваются как Ints в Kotlin.

Так что в качестве дополнительного вопроса, если вы сможете это объяснить, я также был бы признателен за это.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Заметили ли вы, что разбивка вашего заявления работает?

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

Основной виновник такого поведения - plus подпись оператора.Это все перегрузки 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

Ни одна из них не возвращает Byte, и нет перегрузок plusAssign, поэтому онинеявно создан.

Сначала он выполняет plus(Byte), возвращая Int, затем пытается присвоение, но для этого требуется Byte, поэтому он вызывает вашу ошибку.

0 голосов
/ 25 сентября 2018

Я считаю, что вы должны использовать Байт # плюс (Байт) .

Так что в вашем случае:

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

.toByte(), вероятно, не требуетсяв этом случае, поскольку plus() принимает практически любое число, но я не могу его проверить.

...