将[]字节转换为long时的java.nio.BufferUnderflowException

时间:2016-07-08 06:53:03

标签: java android arrays

我的字节数组有问题。我尝试将其转换为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)

2 个答案:

答案 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();
            }