【问题标题】:Convert USB keyboard data from byte array to String USB4Java将 USB 键盘数据从字节数组转换为字符串 USB4Java
【发布时间】:2025-12-28 09:25:12
【问题描述】:

我正在使用 usb4java 读取 USB 键盘(二维码扫描仪)输入。

我的代码 sn-p 如下所示:

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] 目前,我在上面的代码 sn-p 中传递固定大小的字节数组。例如,如果我期望 1 个字符,我传递 16 作为字节数组的大小,对于 2 个字符 24 作为大小等等。有没有其他优雅的解决方案让它变得动态?

PS:我的字节数组转换器sn-p:

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

感谢您的帮助

编辑 1:此处的完整源代码:http://tpcg.io/zt3WfM

【问题讨论】:

  • 可以发完整的运行程序吗?
  • 好的,我现在在外面,会在 6-7 小时内发布完整代码..
  • @AlpeshJikadra 添加了完整的源代码:tpcg.io/zt3WfM
  • 如果扫描仪将自己呈现为键盘,您不能只收集按键吗? (背景:我也用条码扫描仪做过)
  • 如果一个人开始搜索扫描码列表,结果是重复的。 *.com/questions/27075328/… - 扫描码从usb.org/sites/default/files/documents/hut1_12v2.pdf的第 53 页开始列出

标签: java arrays byte usb4java


【解决方案1】:

基于documentation,格式应为:

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 codes

// '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);

或者你可以使用 Map(0x04, 'A')

【讨论】:

  • 所以你说的是,我可以读取字节数组,丢弃 2 和 0 并得到其余的整数。例如:当我按下A时,丢弃后我会得到4,同样对于A和B,我会得到4,5然后我应该将它添加到0x61?或者有没有其他方法来解析上面的字节数组(有问题)
  • 这里的“2”表示您正在按 Shift。如果你不关心它,你可以丢弃它。