Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将C风格的二进制浮点数组读入Java?_Java_Python - Fatal编程技术网

如何将C风格的二进制浮点数组读入Java?

如何将C风格的二进制浮点数组读入Java?,java,python,Java,Python,我有一个二进制文件,其中包含8个字节的浮点(双字节)。当我使用以下代码在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));

我有一个二进制文件,其中包含8个字节的浮点(双字节)。当我使用以下代码在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();
}
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;
}
#包括
双重测试数据[10]={
-1.504936576164858e-36,
-5.8786584896332E-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(){
文件*fp;
fp=fopen(“foo”、“wb”);
如果(fp!=NULL){
fwrite(测试数据,sizeof(双精度),10,fp);
fclose(fp);
}
返回0;
}

Java的
DataInputStream
总是将数据视为big-endian。使用Python和示例数据可以看到这一点:

>>> 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,)
>s=struct.pack(“d”,s)
(-6.519670308091451e+91,)

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

Java的
DataInputStream
始终将数据视为大端。使用Python和示例数据可以看到这一点:

>>> 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,)
>s=struct.pack(“d”,s)
(-6.519670308091451e+91,)

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

Java正在读取双倍的
作为大端,而您的数据可能是小端。要在Java中读取一点endian double,可以使用:

double d = Double.longBitsToDouble(Long.reverseBytes(is.readLong()));

这将把文件中的八个字节作为一个
long
读取,将各个字节的顺序从一个endian交换到另一个endian,然后将值转换为一个
double

Java将
double
读取为big endian,而您的数据可能是little endian。要在Java中读取一点endian double,可以使用:

double d = Double.longBitsToDouble(Long.reverseBytes(is.readLong()));

这将把文件中的8个字节作为
读取,将各个字节的顺序从一个字节交换到另一个字节,然后将值转换为
双字节

有什么不同?一个“文件”只是一堆字节。当试图理解这些字节时,我们必须知道它们是如何表示的。第一步是使用十六进制编辑器查看文件,找出其中真正的内容以及如何表示它(例如,endianess、auximarry信息等)。没有C风格的数组,因为C在物理表示上依赖于平台的端性。有什么不同?一个“文件”只是一堆字节。当试图理解这些字节时,我们必须知道它们是如何表示的。第一步是使用十六进制编辑器查看文件,找出其中真正的内容以及如何表示它(例如,endianess、auximarry信息等)。没有C风格的数组,因为C在物理表示上依赖于平台端号。如果这是问题所在,我如何在java中将其视为小端号?如果这是问题所在,我如何在java中将其视为小端号?