用Java读取C ++二进制文件

时间:2014-12-19 17:38:36

标签: java c++ binaryfiles

我有一个500MB的二进制文件。有一堆浮动条目。它是由C ++程序编写的。我会像这样用C ++加载它。

void load(char f_name[], int size, float data[])
{
    std::fstream f_bin(f_name, std::ios::in|std::ios::binary);

    f_bin.seekg(std::ios::beg);
    f_bin.read((char*)data, size*sizeof(float));
    f_bin.close();
}

float *data;
int size = 123456789;
data = new float[size];
load("myFile.bin", size, data);

我可以访问浮点值:data [x];在c ++中,它可以快速运行。 java中有类似的东西吗?

修改 看了一下我到目前为止有这个:

        RandomAccessFile f = new RandomAccessFile("C://path//myFile.bin", "r");
        byte[] bytes = new byte[(int)f.length()];
        f.read(bytes);

        float fl = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getFloat();     


        System.out.println(fl);

打印第一个浮点条目。现在我应该通过float循环浮动并将其放在像float[] data这样的数组中。

2 个答案:

答案 0 :(得分:3)

你可以用Java做到这一点。

try(FileChannel fc = new RandomAccessFile("myFile.bin", "rw").getChannel()) {
    FloatBuffer fb = fc.map(MapMode.READ_WRITE, 0, fc.size())
                       .order(ByteOrder.nativeOrder()).asFloatBuffer();
    // use fb 
}

由于内存映射文件并避免内存复制(在C ++中也可以这样做),因此速度要快得多。

答案 1 :(得分:0)

Java标准非常准确地表示浮点的表示方式:

  

Java virtual machine specification 2.3.2:浮点类型是float和double,它们在概念上与   32位单精度和64位双精度格式IEEE 754   IEEE标准二进制文件中规定的值和操作   浮点运算(ANSI / IEEE标准754-1985,纽约)。

但是C ++标准并没有给出很多保证:

  

C ++ 11标准3.9.1 / 8:有三种浮点类型:float,double和long double。 double类型提供的精度至少与   float,long double类型提供的精度至少与   双。 (...)浮点类型的值表示是   的实现定义

使用<limits>,您可以通过便携方式了解有关浮动的更多信息:std::numeric_limits<float>::is_iec559将告诉您是否符合IEC-559 / IEEE-754标准(也称为java) )用于:

  • 如果是,则可以使用二进制数据原样读取浮点数。 (编辑以下PoweredByRice注释;实际上你仍然必须解决潜在的字符串问题,因为IEEE-754将这一点保持开放。有关如何强制在C ++方面强制特定排序的更多信息,look here。在java端,您可以强制执行字节排序或使用默认的
  • 如果没有,您将不得不读取字节并编写浮点格式转换例程,这通常被证明是具有挑战性的。