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

fae0ux8s  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(607)

为什么我要从下面的函数中获取垃圾?
即将到来的 _data 论点是 byte[] = {6D, F3, B4, 15} 这个 _endian 论点是 ByteOrder.ByteOrder.LITTLE_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();

}
pnwntuvh

pnwntuvh1#

我举了一个小例子,看看如何来回转换。
希望有帮助。

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class ByteToDouble {

    public static void main(String[] args) throws IOException {
        double d1 = 123.456;
        double d2 = bytesToDouble(doubleToBytes(d1));

        System.out.printf("d1: %f\nd2: %f\n", d1, d2);
    }

    public static byte[] doubleToBytes(double d) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bos);
        dos.writeDouble(d);
        dos.flush();
        return bos.toByteArray();
    }

    public static double bytesToDouble(byte[] bytes) {
        ByteBuffer buffer = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN);
        return buffer.getDouble();
    }
}

请注意 ByteBuffer#getDouble() 方法将抛出 BufferUnderflowException ,如果缓冲区中剩余的字节少于8个(参见javadoc)

nnt7mjpx

nnt7mjpx2#

在您使用的代码中

m_ByteBuffer.get(_data);

将缓冲区的数据读入 _data . 我想你想用的是bytebuffer

m_ByteBuffer.put(_data);

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

m_ByteBuffer.order(_endian);

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

vbopmzt13#

4个字节代表 float ,8字节a double .

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[])` 是数组的轻量级 Package ,具有对字节的写入功能。全局bytebuffer不一定更快,当然在需要同步时也不一定。

相关问题