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
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.
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.
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:
ObjectOutputStream
-- i.e. re-implement in C++ what Java does in ObjectInputStream
. This is NOT recommended.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.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));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With