2012/07/03

ico形式用のStirling構造体定義ファイル

バイナリエディタStrilingの構造体定義ファイルを作成した。

Stirlingの構造体編集機能はバイナリのデータを見るときに便利な機能で、構造体をC++のソースのように定義しておけば、バイナリのデータを表で見ながら編集することができる。構造体を内包している構造体も定義できる。

ICOファイルのフォーマットの詳細は以下のページが詳しかった。

http://www14.ocn.ne.jp/~setsuki/ext/ico.htm

さて、画像データのヘッダはBitmapInfoHeaderでBMPと同じものなので、定義はIconFileHeaderとIconInfoHeaderを書くだけで済んだ。BitmapInfoHeaderは付属のstruct.defにある)

以下をstruct.defの末尾に追加してください。

struct.def

struct IconFileHeader
{
 WORD icoReserved;
 WORD icoResourceType;
 WORD icoResourceCount;
};

struct IconInfoHeader
{
 BYTE Width;
 BYTE Height;
 BYTE Reserved1;
 WORD Reserved2;
 WORD Reserved3;
 DWORD icoDIBSize;
 DWORD icoDIBOffset;
};

IconFileHeaderは、アイコン一枚のケースが多いのでだいたい00 00 01 00 01になる。

「stirling 構造体」で検索してこられる方が多いので追記

「構造体」を表示するということは、バイナリを何バイトかずつに分けて、見やすく表示するということです。

構造体自体は元々プログラミングの用語で、その名のとおり構造をもったデータのことです。

じゃ、Tomoedaという名前の構造体をつくり、そのなかにKinomotoという1バイトのデータを入れてみます。

struct Tomoeda
{
 BYTE Kinomoto;
};

換言すれば、

struct 構造体の名前
{
 データ;
};

ということです。末尾の;(セミコロン)は、データの定義などの終端を表します。

データのほうは、以下のように定義します。

データの大きさ データの名前;

Kinomotoはデータの大きさが1バイトなのでBYTEになります。2バイトならWORD、4バイトならDWORDとします。

LONG(4バイト)というものもありますが、よその定義では定義が違ったりと曖昧なので使わないようにしてます。

たまにデータの名前にこんな[数字]がついていることがあります。

BYTE Kinomoto[3];

たとえば木之本さん一家の年齢のデータが、2B 11 0Aという3バイトで入っているとします。Kinomoto1、Kinomoto2、Kinomoto3というデータ名で1バイトずつ分けることもできますが、そんな命名をしていたら時間がかかるので、[総数]とデータの名前のあとに書くことで、総数分のデータであるというふうにかけるわけです。

いわゆる配列ですね。お役に立てたら幸いです。

コメントを投稿