# Java Long-Werte in C++ auslesen



## JTryn (8. Sep 2011)

Hallo,

ich versuche über folgende Methode in Java Long-Werte in eine Datei zu schreiben:

```
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.

```
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.


```
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:

```
VALUE: 0
VALUE2: 16777216
VALUE3: 0
VALUE4: 33554432
```

Speichere ich die Werte mit C++ (hiermit)

```
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?


----------



## andiv (8. Sep 2011)

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


----------



## JTryn (8. Sep 2011)

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.


----------



## andiv (8. Sep 2011)

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.


----------



## JTryn (8. Sep 2011)

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.


----------

