我正在尝试通过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 如何以十六进制格式显示接收的字节?
编辑:afted使用函数byteToHexString()只有当我以ASCII字符发送数据时才会弹出Toast,当以hex作为发送时没有任何反应。我无法调试它,因为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编号时执行
答案 0 :(得分:0)
你用readBuf [0]调用makeText
,它是byte类型,所以它传播到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();
}