0

我正在尝试通过 android 设备上的 bt 接收数据。当我从终端发送字节时(例如 0x10 0x20 0x30 0x40),我没有得到任何响应(Toast 没有弹出)。我不想以十六进制而不是字符串的形式获取数据。这是处理程序的代码:

 mHandler = new Handler() {

            public void handleMessage(android.os.Message msg)
            {if(msg.what == MESSAGE_READ){

                try {
                    byte[] readBuf = (byte[]) msg.obj;

                    Toast.makeText(MainActivity.this, readBuf[0], Toast.LENGTH_SHORT).show();

            } catch (IllegalArgumentException e) {

                e.printStackTrace();
            }

                }
            }

        };

我正在使用 Android Studio 2.2.3 如何以十六进制形式显示接收到的字节?

编辑:使用函数 byteToHexString() Toast 仅在我以 ASCII 字符发送数据时弹出,以十六进制发送时没有任何反应。我无法调试它,因为 Android Studio 看不到我的设备。处理程序中的修改代码:

byte[] readBuf = (byte[]) msg.obj;

                    String readMessage = new String(readBuf, 0, msg.arg1);
                String HexStr = null;
                    HexStr =  byteToHexString(readBuf);
                    Toast.makeText(MainActivity.this,HexStr, Toast.LENGTH_SHORT).show();

编辑 2:我可以接收数字,但只能从 0x30-0x39 范围内接收数字 - 分配给 ASCII 字符 1-9 的数字。似乎来自处理程序的代码仅在接收 ASCII 数字时执行

4

1 回答 1

0

makeText使用 readBuf[0] 调用,它是字节类型,因此它被传播到 int 并且该方法认为它是资源 id(Lint 应该在那里发出警告)。相反,使用DatatypeConverter#printHexBinary(byte[])将字节数组转换为 String并将其传递给 Toast 方法。

由于 Android API 中没有 javax 包,因此您可以使用String#format传递%2x作为格式参数,以及您希望格式化的一个字节(这将是一个遍历所有字节的循环)。

但是,如果您关心速度,那么这将是最快的:

public static String byteToHexString(byte[] data) {
    StringBuilder res = new StringBuilder(data.length*2);
    int lower4 = 0x0F; //mask used to get lowest 4 bits of a byte
    for(int i=0; i<data.length; i++) {
        int higher = (data[i] >> 4);
        int lower = (data[i] & lower4);
        if(higher < 10) res.append((char)('0' + higher));
        else            res.append((char)('A' + higher - 10));
        if(lower < 10)  res.append((char)('0' + lower));
        else            res.append((char)('A' + lower - 10));
        res.append(' '); //remove this if you don't want spaces between bytes
    }
    return res.toString();
}
于 2017-01-26T15:26:18.447 回答