Когда я пытаюсь получить значение с устройства через 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()
}
Как мне получить желаемое значение?
Будет, но я использовал стандартное приложение чата Bluetooth для получения сигнала, и оно принимает все 5 целых чисел. Я получаю только 1 с моим заявлением. Полагаю, мне нужно знать, как он закодирован, чтобы его расшифровать ...
Это легко сделать с помощью 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.
Это будет определенно зависеть от кодировки строки, написанной на C.