[英]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
,因為你將不可避免地遇到padding和endian -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.