Java ByteBuffer BigEndian 双精度

Java ByteBuffer BigEndian Double

当我尝试在文件中写入具有如下值的二进制文件时:

public static main(String[] args){
    ByteBuffer output = ByteBuffer.allocate(80);
    output.order(ByteOrder.BIG_ENDIAN);
    output.putDouble(545.5);
    appendByteArrayInFile("c:/myPath/", "test.bin", output.array());
}
    private static void appendByteArrayInFile(String exportDirectory, String fileName, byte[] toAppendInFile) {
    if (toAppendInFile != null) {
        File targetExport = createPathAndFile(exportDirectory + fileName);
        try (FileOutputStream output = new FileOutputStream(targetExport, true)) {
            output.write(toAppendInFile);
        } catch (Exception e) {
            // no
        }
    }
}
private static File createPathAndFile(String path) {
    File targetExport = new File(path);
    targetExport.getParentFile().mkdirs();
    return targetExport;
}

问题是,当我查看生成的文件时,双精度数似乎以小端格式放置,而当我将 ByteOrder 切换为小端字节序时,双精度数以大端格式写入... 但是当我输入一个 int 时,字节顺序是正确的。

BigEndian 双精度输出:

01000000 10000001 00001100 00000000 00000000 00000000 00000000 00000000

在 littleEndian 中双精度输出:

00000000 00000000 00000000 00000000 00000000 00001100 10000001 01000000

bigEndian 中的 int 输出:

00000000 00000000 00000010 00100001

据我了解,IEEE 浮点数中的尾数根本不是“字节序”,因为它不是一个独立的数值。如果有效数表示为基数 2,则它是小数点后的二进制数字序列。 (小数点左边,总是假定为“1.”。)尾数表示为0001 00001100 00000000 00000000 00000000 00000000 00000000,这意味着实际尾数为1.00010000110…2。那么,实际值为 1.00010000112 × 29,即 545.5.