[C#] Lesen von Binärdatei einer Java

min

Grünschnabel
Hallo,

Ich versuche zurzeit aus einer von Java erstellten Binären Datei ein paar Werte auszulesen. In Java wird der Datastream wiefolgt erstellt:

Java:
		//ds = datastream
		ds.writeByte(0x54); // Magic number
		ds.writeFloat(MyMath.degToRad(centerLat));
		ds.writeFloat(MyMath.degToRad(centerLon));
		ds.writeShort(amountOfAllNodes);
		ds.writeShort(amountOfInterestNodes);

Nun versuche ich in C# diese Variablen wieder auszulesen. Dafür nutze ich:

C:
                //ds = datastream
                if (ds.ReadByte() != 0x54)
                    textBlock.Text = "Es klappt nicht";
                float centerlat = (float)(BitConverter.ToSingle(ds.ReadBytes(4), 0) * 180 / Math.PI);
                float centerlon = (float)(BitConverter.ToSingle(ds.ReadBytes(4), 0) * 180 / Math.PI);
                Int16 nodeAnzahl = ds.ReadInt16();
                Int16 infoNodeAnzahl = ds.ReadInt16();

Leider werden die Werte nicht richtig ausgewertet. Hat das etwas mit einem Problem zwischen Java und C# zu tun, oder muss ich weiter suchen?

Danke im Voraus
 
Da du hier mit rohen Bytes arbeitest, sollte die Sprache überhaupt keine Rolle spielen. Bei mir funktioniert es auch.

Java:
import java.io.*;

class Data {
	public static void main(String[] args) throws IOException {
		DataOutputStream ds = new DataOutputStream(new FileOutputStream("foo.bar"));
		
		ds.writeByte(0x54);
		
		ds.close();
	}
}

C#:
using System;
using System.IO;

class Data {
	public static void Main(string[] args) {
		BinaryReader ds = new BinaryReader(new FileStream("foo.bar", FileMode.Open));
		
		Console.WriteLine(ds.ReadByte() == 0x54);
	}
}

Gibt "True" aus.

Für sowas ist die Verwendung eines Hex-Editors ganz empfehlenswert.

Edit: Bei double funktioniert es bei mir auch nicht. Java scheint die Werte anders in die Datei zu schreiben. Der Hex-Editor zeigt den gleichen Wert wie mein C# Programm.

Edit2: http://download.oracle.com/javase/1.4.2/docs/api/java/io/DataOutputStream.html#writeDouble(double)
Converts the double argument to a long using the doubleToLongBits method in class Double, and then writes that long value to the underlying output stream as an 8-byte quantity, high byte first. If no exception is thrown, the counter written is incremented by 8.
 
Zuletzt bearbeitet:
Danke für die bestätigung. Wenn man einen Nachmittag an einem eigentlich trivialen Problem hapert, da zweifelt man alles an. Wer weiß, vielleicht liest C# rückwärts?:)

Danke nochmal.
 
Wer weiß, vielleicht liest C# rückwärts?:).

Java schreibt rückwärts. So funktioniert es.

C#:
using System;
using System.IO;

class Data {
	public static void Main(string[] args) {
		BinaryReader ds = new BinaryReader(new FileStream("foo.bar", FileMode.Open));
		
		byte[] bytes = ds.ReadBytes(8);
		
		Array.Reverse(bytes);
		
		Console.WriteLine(BitConverter.ToDouble(bytes, 0) == 0.5d);
	}
}

Edit: little- vs big-endian http://guava-libraries.googlecode.c...e/common/io/LittleEndianDataOutputStream.html
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: min
Zurück