Как преобразовать массив байтов с нулевым завершающим символом в строку в Kotlin?

Когда я пытаюсь получить значение с устройства через 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()
}

Как мне получить желаемое значение?

Это будет определенно зависеть от кодировки строки, написанной на C.

Louis Wasserman 08.12.2018 05:09

Будет, но я использовал стандартное приложение чата Bluetooth для получения сигнала, и оно принимает все 5 целых чисел. Я получаю только 1 с моим заявлением. Полагаю, мне нужно знать, как он закодирован, чтобы его расшифровать ...

Martin Erlic 08.12.2018 08:43
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
1
2
650
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это легко сделать с помощью 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() }.

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

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

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

См. Объяснение в методе 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.

Другие вопросы по теме