Преобразование данных USB-клавиатуры из массива байтов в строку USB4Java

Я читаю ввод с USB-клавиатуры (сканер QR-кода), используя usb4java.

Мой фрагмент кода выглядит так:

byte[] data = new byte[16];
UsbPipe usbPipe = usbEndpoint.getUsbPipe();
if (usbPipe != null) {
    if (!usbPipe.isOpen()) {
        usbPipe.open();
    }
    if (usbPipe.isOpen()) {
        UsbIrp usbIrp = usbPipe.createUsbIrp();
        usbIrp.setData(data);

У меня есть два вопроса:

1] При нажатии A данные байтового массива равны 2,0,0,0,0,0,0,0,2,0,4,0,0,0,0,0
При нажатии AB массив байтов данные 2,0,0,0,0,0,0,0,2,0,4,0,0,0,0,0,2,0,5,0,0,0,0,0

Как преобразовать его в символ в java? т.е. получить A или AB после конвертации.

2] В настоящее время я передаю фиксированный размер массива байтов в приведенном выше фрагменте кода. Например, если я ожидаю 1 символ, я передаю 16 в качестве размера байтового массива, для 2 символов 24 в качестве размера и так далее. Есть ли другое элегантное решение для того, чтобы сделать его динамичным?

PS: фрагмент моего конвертера массива байтов:

StringBuffer sb = new StringBuffer();
for (byte b : data) {
    sb.append(b);
    sb.append(",");
}
String byteString = sb.toString();
return byteString;

Спасибо за любую помощь

РЕДАКТИРОВАТЬ 1: Полный исходный код здесь: http://tpcg.io/zt3WfM


person kleash    schedule 28.04.2019    source источник
comment
Можно ли выложить полную бегущую программу?   -  person Alpesh Jikadra    schedule 02.05.2019
comment
Конечно, я сейчас на улице, выложу полный код через 6-7 часов.   -  person kleash    schedule 02.05.2019
comment
@AlpeshJikadra Добавлен полный исходный код: tpcg.io/zt3WfM   -  person kleash    schedule 03.05.2019
comment
Если сканер представляет себя клавиатурой, нельзя ли просто собирать нажатия клавиш? (Предыстория: я сделал это и со сканером штрих-кода)   -  person Mark Jeronimus    schedule 07.05.2019
comment
@MarkJeronimus, сначала я так и подумал. Но это более сложно, моя java-программа работает в фоновом режиме, и это еще одна дополнительная нагрузка для захвата нажатий клавиш в фоновом java-процессе.   -  person kleash    schedule 07.05.2019
comment
Если начать искать список скан-кодов, это окажется дубликатом. stackoverflow.com/questions/27075328/ - сканкоды перечислены, начиная со страницы 53 usb.org/sites/default/files/documents/hut1_12v2.pdf   -  person tevemadar    schedule 07.05.2019


Ответы (1)


Согласно документации, формат должен быть следующим:

22 00 04 00 00 00 00 00
Offset  Size    Description
0       Byte    Modifier keys status.
1       Byte    Reserved field.
2       Byte    Keypress #1.
3       Byte    Keypress #2.
4       Byte    Keypress #3.
5       Byte    Keypress #4.
6       Byte    Keypress #5.
7       Byte    Keypress #6. 

На основе кодов ASCII

// 'A' is 0x65
byte codeA = 0x04;     // The code for A key
cahr a = 0x61 + codeA ;
byte codeX = 0x1B;     // The code for X key
char x = 0x61 + code; // x == 'X'

System.out.println(a);
System.out.println(x);

Или вы можете использовать карту (0x04, 'A')

person Butiri Dan    schedule 02.05.2019
comment
Итак, вы говорите, что я могу прочитать массив байтов, отбросить 2 и 0 и получить остальные целые числа. Например: когда я нажал А, после сброса я получу 4, аналогично для А и В я получу 4,5, и тогда я должен добавить это в 0x61? Или есть ли другой способ проанализировать массив байтов выше (данный вопрос) - person kleash; 03.05.2019
comment
2 здесь означает, что вы нажимаете Shift. Если вас это не волнует, вы можете отказаться от него. - person Denis Tulskiy; 09.05.2019