はじめに
こんにちは!
情熱開発部プログラム課の角谷です!
今回は社内でバイナリファイルを開く際に使っている「TSXBIN」というバイナリエディタツールの紹介をします。
よろしくお願いします!
バイナリエディタを使用する目的
「TSXBIN」の説明をする前にバイナリエディタを使用する場合がピンと来ない人もいると思うので、まずはバイナリエディタの使用する目的について説明したいと思います。
画像ファイルを開く際主なソフトとしてペイントソフト等で開く事が多いかと思います。
どのような見た目の画像ファイルかという事を確認したい場合はこれで問題ないですが、画像ファイルの中身がどういうデータ構造になっているのかという事を調べるのにはこれでは不十分です。
なので、この場合にバイナリエディタを使用します。
通常のバイナリエディタでは以下の画像のように中身のデータを表示してくれますが、このままデータ構造を把握するのは難しいです。(どこからどこまでがファイルのヘッダーになっているか等)
しかし、「TSXBIN」では後で詳しく紹介しますが、自分でマクロを組むことによりデータの中身を見やすくするSYMBOLという表示方法を使用出来ます。
こちらによりデータの解析をぐっと楽に行う事が出来ます。
以下の画像では上記のペイントソフトで開いた画像ファイルを表示していますが、画像ファイルの横幅や縦幅等が非常に分かりやすく表示されているのが確認できるかと思います。
TSXBINとは
それでは、TSUCHY様が作成された「TSXBIN」について紹介します。
上記でも書いた通り「TSXBIN」とはバイナリエディタとなっています。
以下のページの「TSXBIN」を選択する事によってダウンロードできます。
(いつも使わせていただいています。TSUCHY様ありがとうございます。)
http://www.net3-tv.net/~m-tsuchy/tsuchy/dlpage.htm
ダウンロードしたファイルを解凍し、TSXBIN.exeをクリックする事により「TSXBIN」を起動する事が可能です。(インストール等は不要です。)
起動すると以下の画像のような画面が開かれます。
これはエディタを開いたが特にファイルを何も開いていないので特に何も表示されていません。
好きなファイルを「TSXBIN」で開いてみましょう。
以下の画像のような画面になるかと思います。
右下の青で囲っている型を変更する事でビット表示16進数表示 符号あり10進数符号なし10進数と表示を変える事が出来ます。
左下の赤で囲っているサイズを変更する事で表示する区切りを1BYTEから8BYTEまで変更する事が可能です。
赤で囲っているサイズの一番右のSYMBOLを選択する事により上記で説明したSYMBOL表示が可能となります。
「TSXBIN」のマクロ.SYMファイルについて
「TSXBIN」のフォルダ内に既に.SYMファイルが入っていたと思います。
こちらのファイルが上記で話したマクロが書かれたファイルとなります。
.SYMファイルの名前と一致した拡張子のファイルはSYMBOLとして「TSXBIN」で表示する事が可能になります。
例として一度BMP.SYMファイルの中を見れば分かりますが、
C言語ライクで書けるようになっています。
自分でマクロを作成してみましょう。
ここでは私が適当に作った.TESTファイルを表示するマクロを作成しようと思います。
作成する側のコードは以下のようなコードです。
#include <iostream>
#include <fstream>
#include <string>
struct Test
{
int magic;
int datacount;
};
int main()
{
Test test;
test.magic = 0x100;
test.datacount = 0;
std::ofstream file;
std::string filename = "G:/TSXBINTEST/sample.test"; // ここは適当なパスに変更してください
file.open(filename, std::ios::binary);
file.write((char*)(&test.magic), sizeof(test.magic));
file.write((char*)(&test.datacount), sizeof(test.datacount));
file.close();
}
吐き出したsample.test「TSXBIN」で表示すると以下のようになります。
頭の4バイトのmagic変数に当たるところに16進数で100の値が入っており。
次の4バイトのdatacountの変数に当たる部分には0が入っています。
ファイルの内容的には問題なさそうです。
では、TEST用の.SYMファイルTEST.SYMファイルを作成していきます。
デフォルトでは「TSXBIN.exe」と同じ階層に.SYMファイルを配置する事により、作成した.SYMファイルが読み込まれます。
設定→オプションのマクロファイルディレクトリを指定する事によって自分の好きなフォルダの.SYMファイルを使用する事も出来ます。
以下のようにTEST.SYMファイルを作成しました。
struct Test
{
int magic;
int datacount;
};
void main( void ); // 関数のプロトタイプ宣言
main(); // main関数を実行
return; // これ以降の処理をしないようにreturnやbreakをする必要がある。
// ---------------------------------------------------------------- //
// メイン処理 //
// ---------------------------------------------------------------- //
void main( void )
{
$Test test; // $を付ける事でファイルから変数に値を代入する
}
では、一度「TSXBIN」を開き直して、もう一度sample.testファイルを開いてみましょう。
以下のようにSYMBOL表示されているかと思います。
このように「TSXBIN」のマクロは書き方に少し癖はありますが、簡単にバイナリファイルをSYMBOL表示させる事が可能です。(C言語等でプログラミングに慣れている方は特に楽だと思います。)
上記のように毎回決まったファイルサイズのようなファイル形式のファイルは少ないと思います。
もちろん、マクロ側で対応する事によりそのようなファイルでも問題なくSYMBOL表示する事が可能です。
sample.testファイルの作成プログラムを以下のように変更します。
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
struct Test
{
int magic;
int datacount;
std::vector<int> data;
};
int main()
{
Test test;
test.magic = 0x100;
test.datacount = 0xa;
for (int i = 0; i < test.datacount; i++)
{
int data = i;
test.data.push_back(data);
}
std::ofstream file;
std::string filename = "G:/TSXBINTEST/sample.test"; // ここは適当なパスに変更してください
file.open(filename, std::ios::binary);
file.write((char*)(&test.magic), sizeof(test.magic));
file.write((char*)(&test.datacount), sizeof(test.datacount));
file.write((char*)(&test.data[0]), sizeof(int) * test.datacount);
file.close();
file.clear();
}
作成したsample.testを「TSXBIN」で確認してみましょう。
以下の画像のように対応していないdata部分はSYMBOL表示されていない状態かと思います。
これをSYMBOL表示させてみましょう。
TEST.SYMファイルを以下のように変更します。
struct Test
{
int magic;
int datacount;
};
void main( void ); // 関数のプロトタイプ宣言
main(); // main関数を実行
return; // これ以降の処理をしないようにreturnやbreakをする必要がある。
// ---------------------------------------------------------------- //
// メイン処理 //
// ---------------------------------------------------------------- //
void main( void )
{
$Test test; // $を付ける事でファイルから変数に値を代入する
$int data[test.datacount];
}
ファイルから値を代入する「$」マークを付けるとファイルのオフセットが進んでしまいます。「TSXBIN」ではオフセットを戻るという事は出来ないのでオフセットを進めたくないがファイルの値を参照したい場合は以下のように記述します。
struct Test
{
int magic;
int datacount;
};
void main( void ); // 関数のプロトタイプ宣言
main(); // main関数を実行
return; // これ以降の処理をしないようにreturnやbreakをする必要がある。
// ---------------------------------------------------------------- //
// メイン処理 //
// ---------------------------------------------------------------- //
void main( void )
{
int count = GetDword(2); // ファイルの4バイト目から4バイト分値を取得する
$Test test; // $を付ける事でファイルから変数に値を代入する
$int data[count];
}
上記標準関数等の仕様については「TSXBIN.exe」と同じ階層にあるMACROHLP.HLPを見れば細かい情報が載っているので気になる人は是非確認してみてください。
おわりに
いかがだったでしょうか。
現在社内で良く使用しているバイナリエディタの「TSXBIN」について紹介させていただきました。
マクロを組むことでどんな拡張子のファイルも分かりやすく表示できるというのはとても便利だと思います。
ここで紹介出来た機能は一部なので是非自分で触ってみてください。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。