繁体   English   中英

如果我用Java生成二进制文件,该如何读取C ++中的二进制文件?

[英]How do I read a binary file in C++ if I generate it in Java?

我正在研究一种加密算法,我需要用Java(二进制文件)生成一些信息才能用C ++读取。

我不确定问题是如何创建二进制文件或如何读取二进制文件,尽管我可以完美地读取Java中的信息。

所以我做了一个简单的测试。 在Java中,我将数字9保存到二进制文件中,然后尝试用C ++读取它,但是它不读取数字。

有人可以告诉我我该怎么做吗?

Java代码:

int x = 9;

        try{
            ObjectOutputStream salida=new ObjectOutputStream(new 
            FileOutputStream("test.bin"));
            salida.writeInt(x);
            salida.close();
            System.out.println("saved");
        } catch(Exception e){
            System.out.println(e);
        }

C ++代码:


streampos size;
  char * memblock;

  ifstream file ("test.bin", ios::in|ios::binary|ios::ate);
  if (file.is_open())
  {
    size = file.tellg();
    cout<< size << endl;
    memblock = new char [size];
    file.seekg (0, ios::beg);
    file.read (memblock, size);
    file.close();

    int i;
    for (i = 0; i < sizeof(memblock); i++)
    {
        cout << memblock[i] <<endl;
    }
 delete[] memblock;
  }
  else cout << "Unable to open file";

这是输出:

�
�


w

您的问题是您正在使用ObjectOutputStream写入数据。 这将以专用于Java的形式对对象图进行编码,以供ObjectInputStream读取。 为了使数据流与C ++兼容,您需要执行以下两项操作之一:

  1. 用C ++代码实现,可以理解ObjectOutputStream产生的输出格式-即在C ++中重新实现Java在ObjectInputStream 不建议这样做。
  2. 使用定义的序列化格式,使用标准FileOutputStream从Java写入数据,然后可以由C ++代码读取。 如何指定和实现此功能取决于您,但是可以非常简单,具体取决于数据的复杂性。

您必须以16进制写入文件int (4个字节?),在文件中必须包含09 00 00 00这样的数据。 在您的cpp代码中,将其读取到char数组(读取字节!), file.tellg(); 返回4,您将读取到char * memblock数组{ char * memblock }。 然后将其打印为chars cout << memblock[i] <<endl; 因此,您可以将输出数组打印为

for (i = 0; i < size / sizeof(int) / ; i++) {
   cout << ((int*)memblock)[i] <<endl;
}

或以int数组读取

int* memblock;
...
memblock = new int[size / sizeof(int)];
...
file.read (memblock, (size / sizeof(int)) * sizeof(int));

Java代码:

import java.io.DataOutputStream;
import java.io.FileOutputStream;

public class Main
{

    public static void main( String[] args )
    {
        int x = 9;

        try
        {
            FileOutputStream fout = new FileOutputStream( "prueba.bin" );
            DataOutputStream salida = new DataOutputStream( fout );
            salida.writeInt( x );
            salida.close();
            System.out.println( "guardado" );
        }
        catch( Exception e )
        {
            System.out.println( e );
        }
    }
}

C ++ Builder代码:

unsigned char buffer[4];
ifstream file( "prueba.bin", ios::in | ios::binary );
if( file.is_open() )
{
    file.read( (char*)&buffer, sizeof( buffer ) );
    int num = buffer[ 0 ] | buffer[1] | buffer[ 2 ] | buffer[ 3 ];
    // another way to convert endianness:
    // int num = buffer[ 0 ] | ( buffer[1] << 8 ) | ( buffer[ 2 ] << 16 ) | ( buffer[ 3 ] << 24 );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM