Java 将字节数组转换为双字节数组

Java 将字节数组转换为双字节数组,java,type-conversion,Java,Type Conversion,为什么我要从以下函数中获取垃圾 传入的\u数据参数是字节[]={6D,F3,B4,15} \u endian参数是字节顺序.字节顺序.LITTLE\u endian ByteBuffer m_ByteBuffer; public static double ByteToDouble(byte[] _data, int offset, ByteOrder _endian){ synchronized (m_ByteBuffer) { m_ByteBuf

为什么我要从以下函数中获取垃圾

传入的
\u数据
参数是
字节[]={6D,F3,B4,15}

\u endian
参数是
字节顺序.字节顺序.LITTLE\u endian

 ByteBuffer m_ByteBuffer; 
 public static double ByteToDouble(byte[] _data, int offset, ByteOrder _endian){
        synchronized (m_ByteBuffer) {
            m_ByteBuffer.clear();
            m_ByteBuffer.order(_endian);
            m_ByteBuffer.position(0);
            m_ByteBuffer.get(_data);
            m_ByteBuffer.position(0);
        }
        return m_ByteBuffer.getDouble();

    }

我举了一个小例子,看看如何来回转换

希望能有帮助

import java.io.ByteArrayOutputStream;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.nio.ByteBuffer;
导入java.nio.ByteOrder;
公共类ByteToDuble{
公共静态void main(字符串[]args)引发IOException{
双d1=123.456;
double d2=bytestoduble(doubleToBytes(d1));
System.out.printf(“d1:%f\nd2:%f\n”,d1,d2);
}
公共静态字节[]双字节(双d)引发IOException{
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
DataOutputStream dos=新的DataOutputStream(bos);
可写双工(d);
dos.flush();
返回bos.toByteArray();
}
公共静态double ByTestDouble(字节[]字节){
ByteBuffer buffer=ByteBuffer.wrap(字节).order(字节顺序.BIG_-ENDIAN);
返回buffer.getDouble();
}
}
请注意,如果缓冲区中剩余的字节少于8个,则
ByteBuffer#getDouble()
方法将抛出
BufferUnderflowException
。(参见JavaDoc)

在您使用的代码中

m_ByteBuffer.get(_data);
它会将缓冲区的数据读入
\u data
。我想你想用的是

此外,在将数据放入缓冲区后,更常见的做法是使用
位置(0)
,因为这样可以正确设置缓冲区的限制。总而言之,这将大致导致:

m_ByteBuffer.order(_endian);

m_ByteBuffer.clear();
m_ByteBuffer.put(_data);
m_ByteBuffer.flip();
m_ByteBuffer.getDouble();

4个字节表示浮点,8个字节表示双字节

byte[] data = {0x6D, 0xF3, 0xB4, 0x15};
double x = bytesToDouble(data);

public static double bytesToDouble(byte[] data) {
    ByteBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
    return data.length == 4 ? bb.getFloat() : bb.getDouble();
}

ByteBuffer.wrap(byte[])
是数组的轻量级包装,具有对字节的写入功能。全局ByteBuffer不一定更快,在需要同步时肯定不会更快。

欢迎访问stackoverflow.com。请注意,这是一个讲英语的网站,这里很少有人能理解什么看起来像韩语。我投票将这个问题作为离题题来结束,因为它不是用英语写的。没有什么好的理由把你的注释行留在那里,混淆和混乱代码。您的工作是帮助我们帮助您,使您的问题集中、清晰、清晰,让我们尽可能容易地找出问题所在,而不必猜测您是在那里留下代码向我们解释什么,还是仅仅因为懒惰。谢谢!!我试着跑flip()。但是,发生了一个错误,程序终止。错误:E/AndroidRuntime:致命异常:java.nio。BufferUnderflowException@RAYZIE澄清一下:BufferUnderflowException在调用getDouble时抛出(根据文档,flip不能抛出)?请记住,
double
表示8个字节。您可能想使用
getFloat
byte[] data = {0x6D, 0xF3, 0xB4, 0x15};
double x = bytesToDouble(data);

public static double bytesToDouble(byte[] data) {
    ByteBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
    return data.length == 4 ? bb.getFloat() : bb.getDouble();
}