gpt4 book ai didi

java - 如何将C风格的二进制 float 组读入Java?

转载 作者:行者123 更新时间:2023-12-01 18:28:34 24 4
gpt4 key购买 nike

我有一个包含 8 字节 float ( double )的二进制文件。当我使用以下代码在 python 中读取它时:

import array
d = array.array('d')
d.fromfile(open("foo", mode="rb"), 10)
print d

我得到的结果与在同一文件上运行的 java 代码不同:

DataInputStream is;

try {
is = new DataInputStream(new FileInputStream(FILE_NAME));

int n = 0;

while(n < 10) {
System.out.println(is.readDouble());
n++;
}

is.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

我做错了什么?

以下是示例输出:

Java:

-6.519670308091451E91
-6.723367689137016E91
0.0
-6.519664091503568E91
1.2029778888642203E-19
1.2029778888642203E-19
1.2028455399662426E-19
-1.1421078747242632E217
2.2734939098318505E236
-3.494281168153119E125

Python:

array('d', [-1.504936576164858e-36, -5.878658489696332e-39, 0.0, -5.878658478748688e-39, 5.878658495170291e-39, 5.878658495170291e-39, -5.878655692573363e-39, -5.87865851296011e-39, 4.79728723e-315, 1.546036714e-314])

这是我用来生成数据的 C 程序:

#include <stdio.h>

double test_data[10] = {
-1.504936576164858e-36,
-5.878658489696332e-39,
0.0,
-5.878658478748688e-39,
5.878658495170291e-39,
.878658495170291e-39,
-5.878655692573363e-39,
-5.87865851296011e-39,
4.79728723e-315,
1.546036714e-314
};

int main() {
FILE * fp;
fp = fopen("foo", "wb");
if(fp != NULL) {
fwrite(test_data, sizeof(double), 10, fp);
fclose(fp);
}
return 0;
}

最佳答案

Java 的 DataInputStream 始终将数据视为大端字节序。您可以使用 Python 的 struct module 来查看这一点和您的示例数据:

>>> s = struct.pack("<d", -1.504936576164858e-36)
>>> s
'\xd3\x00\x00\xb9\xd3\x00\x80\xb8'
>>> struct.unpack("<d", s)
(-1.504936576164858e-36,)
>>> struct.unpack(">d", s)
(-6.519670308091451e+91,)

您需要回答的问题是您正在查看的数据是否存储为小端或大端并正确解释它。

关于java - 如何将C风格的二进制 float 组读入Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25142915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com