簡體   English   中英

C struct寫在文件中,用Java打開

[英]C struct written in file, open with Java

例如在CI中有結構:

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

然后我把它寫到文件fwrite(&tr, 1, sizeof(tr), fp); (tr - 它的CTRstruct var,fp - 文件指針);

然后我需要用Java閱讀它! 我真的不知道如何從文件中讀取struct ...我試圖用ObjectInputStream()讀取它,最后的想法是用RandomAccessFile()讀取但我也不知道如何...( readLong(), readDouble()也不起作用,它工作原理但不讀取正確的數據)。 那么,任何想法如何用Java從二進制文件中讀取C結構?


如果它有趣,我的版本讀取整數(但它很丑,我不知道如何處理double ):

public class MyDataInputStream擴展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));
}

使用double我們可以以相同的方式處理(比如使用int或long(8bytes)然后使用native func轉換為double)。

你不應該使用整個struct fwrite ,因為你將不可避免地遇到paddingendian -ness的問題。 C方將按照它在內存中的方式轉儲整個struct ,包含編譯器為性能等所有的空白。這就是“不可移植之母”!

相反,您應該使用協議緩沖區,JSON或其他一些便攜式序列化來完成您的任務。

使用將數據序列化到磁盤 這將使閱讀它變得更加容易。 確保庫使用記錄良好的存儲格式。

您必須找出在執行程序的體系結構中使用這些C類型(int,double)和endianness(感謝andrew cooke)的大小,並在Java中使用相同大小的類型。

DataInputStream是在Java中讀取原始輸入的典型方法 - 我認為你應該能夠做到

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

但我並不是100%確定字節順序和其他問題是兼容的。

好吧,萬一JNI是你的選擇,你可以在C中讀回來。使用swig你可以很容易地暴露你的結構,以及它從文件中讀取的功能。 當然,JNI帶來的所有麻煩都不值得單獨解決這個問題,但您可能已經在使用它了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM