将字节流解除分类为Java类

时间:2016-06-15 00:14:11

标签: java android serialization

我已经嵌套了" 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程序来将其恢复并从中创建这些类对象。

非常感谢任何想法!

2 个答案:

答案 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;
    }
}