2012-04-15 5 views
3

Zum Beispiel in C Ich habe Struktur:C-Struktur in der Datei geschrieben, offen mit Java

typedef struct { 
    int number; 
    double x1; 
    double y1; 
    double x2; 
    double y2; 
    double x3; 
    double y3; 
} CTRstruct;` 

Dann schreibe ich es fwrite(&tr, 1, sizeof(tr), fp); (tr - sein CTRstruct var, fp - Dateizeiger) einzureichen;

Dann muss ich es mit Java lesen! Ich weiß wirklich nicht, wie man struct von der Datei liest ... Ich habe versucht, es mit ObjectInputStream() zu lesen, letzte Idee ist, mit RandomAccessFile() zu lesen, aber ich weiß auch nicht, wie man ... (readLong(), readDouble() auch nicht funktioniert, Es funktioniert zwar, liest aber keine korrekten Daten. Also, irgendeine Idee, wie man C struct aus einer Binärdatei mit Java liest?


Wenn es interessant ist, meine Version integer zu lesen (aber es ist hässlich, & ich weiß nicht, was mit double zu tun):

public class MyDataInputStream erweitert Datainputstream {

public MyDataInputStream(InputStream AIs) { 
    super(AIs); 
} 

public int readInt1() throws IOException{ 
    int ch1 = in.read(); 
    int ch2 = in.read(); 
    int ch3 = in.read(); 
    int ch4 = in.read(); 
    if ((ch1 | ch2 | ch3 | ch4) < 0) 
     throw new EOFException(); 
    return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0)); 
} 

mit Doppel können wir den gleichen Weg (wie mit Int oder mit langen (8bytes) & dann konvertieren, um mit nativen Spaß zu verdoppeln c).

+1

Die Art, wie Sie die Struktur in Datei schreiben, ist falsch, sehen Sie sich das an: http://StackOverflow.com/Questions/10153155/write-raw-struct-Contents-Bytes-To-Afile-in-In- c-confused-about-actual-size-wri –

+4

Die eigentlich richtige Antwort wäre, die Speicherrepräsentation der Struktur nicht in eine Datei wie diese zu schreiben. – celtschk

+0

ja, mb, es ist albern, so zu tun, aber ich muss es tun ..(Ich meine, in die Datei die Lochstruktur schreiben) – DaunnC

Antwort

1

Sie müssen herausfinden, welche Größe diese C-Typen (int, double) und welche endianess (Danke andrew cooke) in der Architektur, in der Sie das Programm ausgeführt haben, verwenden und verwenden Sie die gleichen Größen in Java.

+2

und was Endananness. Java nimmt Big-Endian an; Für kleine Endian Verwendung http://ledatastream.softupto.com/ –

1

DataInputStream die typische Art und Weise ist primitive Eingänge in Java zu lesen - ich denke, Sie sollten in der Lage sein zu tun,

int number = dataInputStream.readInt(); 
double x1 = dataInputStream.readDouble(); 
... 
double y3 = dataInputStream.readDouble(); 

aber ich bin mir nicht 100% sicher, dass endianness und andere Fragen werden kompatibel.

+2

Ich würde erwarten, dass die Auffüllung zwischen dem 'int' und dem ersten' double' behandelt werden muss. –

+3

Es hängt wirklich völlig davon ab, wie C entscheidet, es im Speicher darzustellen; Es wäre am besten, dieses eine Feld auf einmal richtig zu machen, anstatt nur die In-Memory-Darstellung zu verwerfen. –

+1

Nun, die erste Frage ist: Ist das int 4 oder 8 Byte? Wenn es 4 Byte ist, müssen wir wahrscheinlich Padding verwenden, wenn es nicht passt, aber plötzlich können wir keinen Java-Int mehr verwenden, sondern brauchen einen Long. Und so weiter und so weiter. Es ist nur eine sehr schlechte Idee. – Voo

4

Sie nicht fwrite des gesamten struct verwenden sollte, weil man unweigerlich in Probleme mit Polsterung und Endian -ness laufen wird. Die C-Seite wird die gesamte struct die Art und Weise, wie es im Speicher ist, mit all seinen Lücken, die der Compiler für Leistung usw. einsetzt, dumpen. Das ist "die Mutter der Nicht-Portabilität"!

Stattdessen sollten Sie Protokollpuffer, JSON oder eine andere Art der portablen Serialisierung verwenden, um Ihre Aufgabe zu erfüllen.

1

Nun, in dem unwahrscheinlichen Fall, dass JNI eine Option für Sie ist, könnten Sie es zurück in C lesen. Mit swig können Sie leicht Ihre Struktur offen legen, zusammen mit ihrer Funktion aus der Datei zu lesen. Natürlich sind all die Probleme, die JNI mit sich bringt, allein für dieses Problem nicht wert, aber Sie verwenden es vielleicht schon.

Verwandte Themen