簡體   English   中英

將字節數組轉換為雙精度

[英]convert byte array to double

為什么我從以下函數中得到了垃圾?

傳入的_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();

    }

我做了一個小例子來看看如何來回轉換。

希望能幫助到你。

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

請注意,如果緩沖區中剩余的字節少於 8 個,則ByteBuffer#getDouble()方法將拋出BufferUnderflowException (見 JavaDoc)

在您使用的代碼中

m_ByteBuffer.get(_data);

這會將緩沖區的數據讀入_data 我想你想使用的是ByteBuffer#put

m_ByteBuffer.put(_data);

此外,在將數據放入緩沖區后,更常用的是使用flip而不是position(0)因為這正確設置了緩沖區的限制。 總而言之,這將大致導致:

m_ByteBuffer.order(_endian);

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

4 個字節表示一個float ,8 個字節表示一個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[])是一個輕量級的數組包裝,具有寫入字節的能力。 全局 ByteBuffer 不一定更快,當然在需要同步時更是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM