Java Long-Werte in C++ auslesen

JTryn

Mitglied
Hallo,

ich versuche über folgende Methode in Java Long-Werte in eine Datei zu schreiben:
Java:
public void save_longs(){
	try {
	JFileChooser saveDialog=new JFileChooser();
	saveDialog.showSaveDialog(window);
	FileOutputStream file=new FileOutputStream(saveDialog.getSelectedFile());
	DataOutputStream dos = new DataOutputStream(file);
		
	long test = 1;
	long test2 = 2;
	long test3 = 3;
	long test4 = 4;
		
	dos.writeLong(test);
	dos.writeLong(test2);
	dos.writeLong(test3);
	dos.writeLong(test4);
		
	dos.close();
	}catch (IOException e) {
		e.printStackTrace();
	}
}

Auslesen in Java (testweise) klappt auch.
Java:
public void load_longs(){
	try {
		JFileChooser saveDialog=new JFileChooser();
		saveDialog.showOpenDialog(window);
		FileInputStream file=new FileInputStream(saveDialog.getSelectedFile());
		DataInputStream dos = new DataInputStream(file);
		
		long test = dos.readLong();
		long test2 = dos.readLong();
		long test3 = dos.readLong();
		long test4 = dos.readLong();
		
		System.out.println(test);
		System.out.println(test2);
		System.out.println(test3);
		System.out.println(test4);
		
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}	
}

Wenn ich nun aber versuche in C++ mit folgendem Code versuche die Werte auszulesen
ergeben sich andere Werte als die, die ich eingespeichert habe.

Code:
std::ifstream mapfile("test.map", std::ios::binary);
long test = 0;
long test2 = 0;
long test3 = 0;
long test4 = 0;

mapfile.read(reinterpret_cast < char * > (&test), sizeof(long));
mapfile.read(reinterpret_cast < char * > (&test2), sizeof(long));
mapfile.read(reinterpret_cast < char * > (&test3), sizeof(long));
mapfile.read(reinterpret_cast < char * > (&test4), sizeof(long));

cout << "VALUE: " << test << endl;
cout << "VALUE2: " << test2 << endl;
cout << "VALUE3: " << test3 << endl;
cout << "VALUE4: " << test4 << endl;

In diesem Fall wird mir ausgegeben:
Code:
VALUE: 0
VALUE2: 16777216
VALUE3: 0
VALUE4: 33554432

Speichere ich die Werte mit C++ (hiermit)
Code:
std::ofstream mapfile("test.map", std::ios::binary);
long test = 1;
long test2 = 2;
long test3 = 3;
long test4 = 4;

mapfile.write(reinterpret_cast < char * > (&test), sizeof(long));
mapfile.write(reinterpret_cast < char * > (&test2), sizeof(long));
mapfile.write(reinterpret_cast < char * > (&test3), sizeof(long));
mapfile.write(reinterpret_cast < char * > (&test4), sizeof(long));

mapfile.close();

und lese sie danach wieder mit der Funktion darüber aus werden mir die korrekten Werte
ausgegeben.

Folglich ziehe ich den Schluss, dass Java und C++ die Binärdaten unterschiedlich speichern.
Des Weiteren fiel mir auf, dass Werte wie "-1" wiederum in C++ korrekt ausgelesen werden.

Wie könnte ich die Java-Werte richtig in C++ auslesen?
 
Zuletzt bearbeitet:
Das Problem könnte sein, dass der long-Datentyp in C++ eine andere Größe als in Java hat. Ich meine dass viele C++-Compiler für long genauso wie für int 4 byte verwenden. Dafür gibt es den Datentyp long long der 8 Byte hat! In irgendeiner Headerdatei gibt es Typedefs der Form int8_t, int16_t, int32_t, int64_t,... Verwende doch am Besten die wenn die Größe des Datentyps für deinen Anwendungsfall wichtig ist.

Java: short = 16 Bit, int = 32 Bit, long = 64 Bit

Edit: Der Header heißt cstdint
 
Leider nicht, aber gut zu wissen, wird sicher interessant sein, wenn ich mehr damit mache.

Egal ob ich es als _int64, int_64t (aus dem Header) oder long long einlese (die alle richtigerweise
mit einer Bytegröße von 8 zurückgegegeben werden) - das Problem besteht weiterhin.
Stattdessen werden mir nun sogar noch viel größere Zahlen in der Konsole ausgegeben.
 
Nächster Verdacht: Byte-Order (also die Reihenfolge in der die Bytes gespeichert werden)
Schau dir mal die erstellten Dateien mit einem Hex-Editor an und schau ob da Little Endian oder Big Endian verwendet wird. Das würde für mich die völlig falschen Zahlen erklären.
 
Vielen Dank! Daran lag es. Wie es aussieht verwendet Java Big-Endian, während C++
Little-Endian verwendet. Mit einer Funktion zum switchen in C++ werden nun die
richtigen Werte ausgegeben.
 

Zurück
Oben