我的字节数组有问题。我尝试将其转换为long,然后转换为hex并将其显示为toast。但是我得到了java.nio.BufferUnderflowException。这是我的代码:
public void onReceivedData(byte[] arg0)
{
String tag = null;
long tagValue = ByteBuffer.wrap(arg0).getLong();
tag = Long.toHexString(tagValue).toUpperCase();
}
问题在于:
long tagValue = ByteBuffer.wrap(arg0).getLong();
我查找了有关此异常的信息,但没有一个答案可以解决我的问题。
这是logcat:
Process: com.example.eltegps011.eltegps, PID: 17304
java.nio.BufferUnderflowException
at java.nio.ByteArrayBuffer.getLong(ByteArrayBuffer.java:211)
at com.example.eltegps011.eltegps.fragments.StocktakingFragment$9.onReceivedData(StocktakingFragment.java:504)
at com.felhr.usbserial.UsbSerialDevice$WorkerThread.onReceivedData(UsbSerialDevice.java:261)
at com.felhr.usbserial.UsbSerialDevice$WorkerThread.run(UsbSerialDevice.java:235)
答案 0 :(得分:0)
因为你似乎有一个可变的字节数:
arg0 = Arrays.copy(arg0, 8);
所以你有8个字节长:xx xx ... 00 00
或许你只需要一个字节数组的十六进制转储:
public String bytesToString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (int i = 0; i < bytes.length; ++i) {
sb.append(String.format("%02X ", 0xFF & bytes[i]));
}
return sb.toString();
}
答案 1 :(得分:-1)
在从ByteBuffer获取长值之前添加一项检查
ByteBuffer byteBuffer = ByteBuffer.wrap(arg0);
if(byteBuffer.remaining()>0){
long tagValue= byteBuffer.getLong();
tag = Long.toHexString(tagValue).toUpperCase();
}