読者です 読者をやめる 読者になる 読者になる

Cの構造体をJavaでうまく扱う

Java

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