gpt4 book ai didi

java - 从用 Java 编写的二进制文件中检索 C 中的 double

转载 作者:搜寻专家 更新时间:2023-11-01 03:56:32 24 4
gpt4 key购买 nike

我正在用 Java 将一个 double 值写入如下文件,

byte[] bytes = new byte[8];
//Double d = new Double(4);
double d =1000;
ByteBuffer.wrap(bytes).putDouble(d);
File test = new File(FILE_PATH+"readme.bin");
test.createNewFile();
FileOutputStream ostream = new FileOutputStream(test);
ostream.write(bytes);
ostream.close();

我可以用 Java 代码读回它,但是当用 C 代码检索它时,我得到的值是 0.000000。我的C代码如下,

FILE *file_ptr;
file_ptr = fopen(file_absolute,"rb");
if (!file_ptr)
{
printf("Unable to open file!");
return 1;
}
char bytes[8];
fread(&bytes, 8, 1, file_ptr);

double d = *((double*)bytes);
printf("%f",d);

我在这里遗漏了什么吗? C 和 Java 代码都在同一系统上运行。

最佳答案

Java 代码以与 C 期望相反的顺序输出字节。

所以需要颠倒字节顺序。以下将在标准的小端操作系统中工作:

#include <stdio.h>

void main() {
FILE *file_ptr;
unsigned char bytes[sizeof(double)];
union {
double d;
unsigned char bytes[sizeof(double)];
} u;

int c;

file_ptr = fopen("float.bin","rb");
fread(bytes,sizeof(double),1,file_ptr);

for (c=0; c<sizeof(double); c++)
u.bytes[c]=bytes[sizeof(double)-1-c];

printf("%f\n", u.d);
}

只要目标系统对于我见过的任何标准系统和 C 编译器来说都是小端字节序,这就会起作用。

如果你想让代码更便携,你可以在编译时(使用宏,参见 https://sourceforge.net/p/predef/wiki/Endianness/)或在运行时检测 C 代码的字节顺序。有一些并不少见的系统,尤其是基于 ARM 和 MIPS 的系统,它们通常是大端的,这里不需要转换。无论底层系统如何,Java 始终会产生大端输出,因此只有 C 代码需要有条件。

对于一个非常便携的版本,您可以使用宏或在运行时检测字节顺序,这两个选项都在给出的链接中进行了解释。如果您只打算在 Windows 或运行 Linux 的 PC 上运行此代码,并且不关心可移植性,则可以使用上面的代码。

关于java - 从用 Java 编写的二进制文件中检索 C 中的 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37095644/

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