将[]字节转换为长字节时发生java.nio.BufferUnderflowException

将[]字节转换为长字节时发生java.nio.BufferUnderflowException,java,android,arrays,Java,Android,Arrays,我的字节数组有问题。我尝试将其转换为long,然后转换为hex,并作为祝酒词显示。但是我得到了java.nio.BufferUnderflowException。这是我的密码: public void onReceivedData(byte[] arg0) { String tag = null; long tagValue = ByteBuffer.wrap(arg0).getLong(); tag =

我的字节数组有问题。我尝试将其转换为long,然后转换为hex,并作为祝酒词显示。但是我得到了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)

在从ByteBuffer获取长值之前添加检查

ByteBuffer byteBuffer = ByteBuffer.wrap(arg0);
            if(byteBuffer.remaining()>0){
                long tagValue= byteBuffer.getLong();
                tag = Long.toHexString(tagValue).toUpperCase();
            }

由于您似乎有一个可变的字节数:

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();
}
公共字符串bytesToString(字节[]字节){
StringBuilder sb=新的StringBuilder(bytes.length*3);
对于(int i=0;i
检查arg0的大小,如果大小错误,请执行所需操作。在您的情况下,8的倍数似乎是正确的选择。是否可以动态设置arg0?我不知道您到底要做什么。字节数组只是在字节缓冲区中被调用。因此,如果您保存字节缓冲区,字节数组也会受到更改的影响。所以是的。arg0不是常量。因此,另一个是的。我应该得到一个字节数组,其中包含9个字节。取而代之的是一个1字节的数组和一个8字节的数组。我想,这就是问题所在。你能告诉我如何修复它吗?我仍然有两个数组:/第一个有一个字节,第二个有八个字节。扩展了答案,使用十六进制转储,在两个十六进制数字后添加了一个空格以清晰显示。Joop thx,它可以工作,但仍然是:07-08 10:22:57.181 15705-16302/com.example.eltegps011.eltegps E/stocktaking fragment:onReceivedData:DA 07-08 10:22:57.181 15705-16302/com.example.eltegps E/stocktaking fragment:onReceivedData:AD 06 74 01 6F 6B 60位应该是DA AD 06 74 01 6F 6B 26,DA似乎已经丢失/读取。祝你好运。