Cで宣言されている構造体をそのままJavaのフィールドにマッピングさせて、バイナリからロードできるようにしたいけどどうすればいいんだろうって話。
元々の動機はJavaでEXEとかDLLを解析することなんだけど、そのためにそんなことができれば便利かなと思った。
使い方のイメージ。
Cで次のような構造体が宣言されているとする(実際はPEファイルだったらIMAGE_DOS_HEADERとか)
typedef struct { int x; int y; } point;
で、Javaでは次のようなクラスを定義しておく。
public class Point extends Struct { private int x; private int y; (略) }
これを次のようにバイト列を食わせてあげると、フィールドがセットされているね、という話。
byte[] bytes = { 0x01, 0x02, 0x03, 0x04 }; Point p = new Point(); p.load(bytes, 0, 0); System.out.println(p.getX()); # 0x0102 = 258 System.out.println(p.getY()); # 0x0304 = 772
継承をなくしたり、もうちょっとうまい具合に使えるようにしたいけど…。
型の割り当てはアノテーションで宣言できるようにしたいね。今はJNA(Java Native Access)とかもあるし、その辺りを参考にすればいいのかな。
実装にあたってのTODO
- signed, unsigned
- エンディアン
- ポインタの扱い