我已经嵌套了" C"像这样的语言数据结构:
struct xyz {
char a[256];
char b[1024];
} XYZ;
struct abc {
unsigned char dat1[1024];
int dat2;
} ABC;
struct def {
int x;
int y;
int z;
} DEF;
struct tot {
XYZ p1;
ABC p2[45];
DEF p3[17];
} TOT;
TOT tot;
填充TOT后,我将其写入C程序中的这样一个文件。
fwrite((char *)& tot,1,sizeof(TOT),file);
现在我必须使用JAVA程序读回同一个文件,并为ANDROID重新创建与相应JAVA类相同的C数据结构。
所以我创建的类看起来像上面的C结构,这些类只包含数据成员而没有像这样的方法
class XYZ {
byte a[]=new byte[256];
byte b[]=new byte[1024];
} XYZ;
class ABC {
byte dat1[1024];
int dat2;
};
class DEF {
int x;
int y;
int z;
};
class TOT {
XYZ p1;
ABC p2[45];
DEF p3[17];
};
我知道上面的类中存在一些语法错误,但我希望你能理解。
那么如何从文件中读取所有字节并使用它来创建所有这些嵌套的JAVA类对象,如上所示,以匹配顶部的原始C结构?
我猜它类似于JAVA(Android)中的反序列化,但序列化程序是使用fwrite的C程序。
从文件中逐个读取字节会很难,并手动填写JAVA类对象,同时还要考虑从Windows C到JAVA的不同大小的数据类型和字节顺序,有更快的方法吗?
不幸的是,二进制数据已经使用C写入文件并且无法更改,因此我必须编写一个JAVA程序来将其恢复并从中创建这些类对象。
非常感谢任何想法!
答案 0 :(得分:0)
您可以使用DataInputStream
,提供发件人正在使用网络字节顺序,相当轻松地执行此操作。
如果不是,我只能建议你扔掉C端并用适当定义的应用协议重新开始。正如我在这里所说,不要使用structs
作为应用程序协议。使用应用程序协议作为应用程序协议'。例如,您可以查看XDR。
答案 1 :(得分:0)
将这些结构加载到内存中的最简单方法是使用ByteBuffer
,因为您可以控制字节顺序。
以下示例将在构建Java对象之前首先将整个文件加载到内存中。由于Java对象将占用更多的内存,因此它不应该是一个主要问题。
班级的字段也已得到纠正。
代码假设小端顺序(x86处理器),并且C int
是4个字节,即映射到Java int
。
ByteBuffer buffer = ByteBuffer.wrap(Files.readAllBytes(Paths.get("C:/fileFromC.bin")));
buffer.order(ByteOrder.LITTLE_ENDIAN); // if C code was run on x86 processor
TOT tot = TOT.load(buffer);
class XYZ {
byte a[] = new byte[256];
byte b[] = new byte[1024];
static XYZ load(ByteBuffer buffer) {
XYZ xyz = new XYZ();
buffer.get(xyz.a);
buffer.get(xyz.b);
return xyz;
}
}
class ABC {
byte[] dat1 = new byte[1024];
int dat2;
static ABC load(ByteBuffer buffer) {
ABC abc = new ABC();
buffer.get(abc.dat1);
abc.dat2 = buffer.getInt();
return abc;
}
}
class DEF {
int x;
int y;
int z;
static DEF load(ByteBuffer buffer) {
DEF def = new DEF();
def.x = buffer.getInt();
def.y = buffer.getInt();
def.z = buffer.getInt();
return def;
}
}
class TOT {
XYZ p1;
ABC[] p2 = new ABC[45];
DEF[] p3 = new DEF[17];
static TOT load(ByteBuffer buffer) {
TOT tot = new TOT();
tot.p1 = XYZ.load(buffer);
for (int i = 0; i < tot.p2.length; i++)
tot.p2[i] = ABC.load(buffer);
for (int i = 0; i < tot.p3.length; i++)
tot.p3[i] = DEF.load(buffer);
return tot;
}
}