Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

java

c++

I'm working on an encryption algorithm and I need to generate some information in Java (a binary file) to read in C++.

I'm not sure if the problem is how I create the binary file or how I read it, though I can perfectly read the information in Java.

So I made a simple test. In Java I save the number 9 to a binary file, and then I try to read it in C++, but it does not read a number.

Can someone please tell me how I can do this?

The Java code:

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);
        }

The C++ code:


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";

This is the output:

�
�


w
like image 299
Alondra Sánchez Avatar asked Aug 30 '19 17:08

Alondra Sánchez


People also ask

How do I read a binary file in C?

Use the fread Function to Read Binary File in C FILE* streams are retrieved by the fopen function, which takes the file path as the string constant and the mode to open them. The mode of the file specifies whether to open a file for reading, writing or appending.

How does Java handle binary data?

A binary literal is a number that is represented in 0s and 1s (binary digits). Java allows you to express integral types (byte, short, int, and long) in a binary number system. To specify a binary literal, add the prefix 0b or 0B to the integral value.


2 Answers

Your problem is that you are using ObjectOutputStream to write the data. This encodes the object graph in a Java-specific form intended to be read with ObjectInputStream. To make the data stream compatible with C++ you would need to do one of two things:

  1. Implement in C++ code that understands the output format produced by ObjectOutputStream -- i.e. re-implement in C++ what Java does in ObjectInputStream. This is NOT recommended.
  2. Write your data out from Java using a standard FileOutputStream, in a serialized format that you define, that then can be read by your C++ code. How you specify and implement this is up to you but can be very simple, depending on the complexity of your data.
like image 57
Jim Garrison Avatar answered Sep 21 '22 10:09

Jim Garrison


Yor write to file int (4 bytes?), in your file in hex must bu such data as 09 00 00 00. In your cpp code you read it to char array (you read bytes!), file.tellg(); return 4, and you read to char * memblock array {9, 0, 0, 0}. And after it you print it as chars cout << memblock[i] <<endl;. So you can print your out array as

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

or read it in int array

int* memblock;
...
memblock = new int[size / sizeof(int)];
...
file.read (memblock, (size / sizeof(int)) * sizeof(int));
like image 33
Юрий Левицкий Avatar answered Sep 22 '22 10:09

Юрий Левицкий