Как преобразовать массив байтов с нулевым завершающим символом в строку в Kotlin? - PullRequest
0 голосов
/ 08 декабря 2018

Когда я пытаюсь получить значение с устройства через Bluetooth, оно появляется в ASCII как значение с прямым порядком байтов, оканчивающееся нулем.Программное обеспечение устройства написано на C. Я хочу получить десятичное значение, то есть 0 вместо 48, 1 вместо 49, 9 вместо 57 и т. Д.

@Throws(IOException::class)
fun receiveData(socket: BluetoothSocket ? ): Int {
 val buffer = ByteArray(4)
 val input = ByteArrayInputStream(buffer)
 val inputStream = socket!!.inputStream
 inputStream.read(buffer)

 println("Value: " + input.read().toString()) // Value is 48 instead of 0, for example.

 return input.read()
}

Как я могу получить значение Iхотите?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Моя функция в конечном итоге приняла следующую форму.Это позволило мне получить все 5 цифр в десятичной форме:

@Throws(IOException::class)
fun receiveData(socket: BluetoothSocket ? ): String {
 val buffer = ByteArray(5)
  (socket!!.inputStream).read(buffer)
 println("Value: " + String(buffer))
 return String(buffer)
}

Для моей конкретной проблемы входная переменная создавалась перед считыванием данных в буфер.Поскольку метод read вызывается для каждого индекса в данных, я получал только первую цифру.

См. Метод Java public int read() для объяснения:

Reads the next byte of data from this input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned.

0 голосов
/ 08 декабря 2018

Это легко сделать с bufferedReader:

val buffer = ByteArray(4) { index -> (index + 48).toByte() }     // 1
val input = ByteArrayInputStream(buffer)

println(input.bufferedReader().use { it.readText() })            // 2
// println(input.bufferedReader().use(BufferedReader::readText)) // 3

Выводит"0123".

1 .Просто заглушает содержимое сокета, используя функцию init, которая устанавливает первый элемент из buffer в 48, второй в 49, в третий в 50 и в четвертый в 51.

2 .Кодировка по умолчанию - UTF-8, то есть «расширенный набор» ASCII .

3 .Это просто другой стиль звонка { it.readText() }.

...