ラベル バイナリビューア の投稿を表示しています。 すべての投稿を表示
ラベル バイナリビューア の投稿を表示しています。 すべての投稿を表示

2014年11月7日金曜日

バイナリビューアを作る(4日目)

細々と修正を重ねているのですが、自分でもどこを変えたか思い出せません。。

とりあえず表示するエンディアンの選択と、表示する変数型の選択は実装しました

あと、ファイルサイズの表示等は昨日のバージョンにはなかったはず…
とりあえずByte,KiB,MiBで表示できるようにしてあります
1024Byteを超えるとKiBで 1024KiBを超えるとMiBで という感じで自動的に表示しています

それとアドレスのオフセットを実装しました
とりあえず今はオフセット後のアドレスをステータスバーに10進で表示しているだけです
オフセットを設定するにはカーソルを移動してF2キーを押すとカーソルの位置を0とします
(F2は検索機能とかがついてるのが普通ですね 多分変更します)

あと、ステータスバーの最後の(0.006)は1フレームを描く時間を示しています
あまりに大量のデータを表示するともっさりしてくるため、目安として表示しているだけですが
といっても、FHD画面1枚に最大で表示しても20fpsくらいは出ます
FHD2枚に最大で表示すると10fpsくらいになるので、スクロールとかの追従性は悪くなります


とりあえずはこれくらいでしょうか
あとは細かいところを作りこめば僕が欲しい機能は粗方実装が終わります
多分ここからが長いんですが。。。
間に合わせで作った部分とかは、ちゃんと作る方法を調べながらになるので 結構面倒な気がします

2014年11月6日木曜日

バイナリビューアを作る(3日目)

だいぶ横長になりました

現状の機能として
・ファイルの読み込み(800MB程度までは確認済み/1.6GBのファイルではメモリ不足エラー)
・任意の場所・任意の長さの選択
・選択した場所のコピー(16進2桁+スペース区切りの連続)
・0x00を強調して表示
・フォントの選択(インストール済みの等幅フォントのみ)
・カーソル位置・選択したデータ数の表示
・選択した箇所から各種変数型で値を表示
という感じです

読み込めるファイルサイズは800MBあたりまでは確認しました
ただこれ以上だとちょうどいい感じのファイルが無くて、確認していません
1GBを超えたあたりでメモリ不足エラーが発生すると思いますが、RAMは32GBで一部RAMDISKにしているとはいえ20GB以上あるので、もうちょっと大量に確保できても良さそうな気がします
C#側で大量にメモリ確保しすぎないように制限かかってるのかも?

ファイルの読み込みは800MBで7秒くらいでした
秒100MB位を読んでるので、HDDのシーケンシャルリード(120MB/sec)に近い速度です
これ以上の高速化はおそらく無理でしょう


変数型ですが、8bit 16bit 32bit 64bit float doubleの6種類を、前者4種類は符号有り・無し含め、リトルエンディアンとビッグエンディアンで表示しています
doubleは精度が約15桁で、それに指数を含めても20桁程度なのですが、64bitを3桁カンマ区切りで表示するとそれ以上の文字数になってしまい、変数表示エリアがかなり広大になります

変数は選択した場所で作れる変数ではなく、選択した部分の一番若いアドレスから1,2,4,8バイトを変数として表示しています
なので16バイト分選択したからといって128bit変数として扱うわけではありません


昨日のバージョンでは、文字列を画面に書き込むたびに書いたサイズを積算していました
が、それでは等幅フォントを使用していても少しずつズレが発生していました

今日のバージョンではフォントをロードした段階で、1文字の大きさを計測して変数に保存しておき、文字を書いたらその大きさを積算していく という感じにしています


既知の重大な問題としては、ウインドウを最小化するとPictureBoxのSizeが0x0になり、Bitmap変数のコンストラクタでエラーが発生してしまいます
とりあえずの解決策としては下位関数に画像を要求する前に解像度を調べて、解像度が1バイト表示できる最低サイズよりも小さい場合は処理を中断する という感じにしようかな と思っていますが、あんまりスマートな方法じゃないのでなぁ


とりあえず、変数の表示ができれば色々と便利ですが、更に便利にすべくアドレスのオフセット表示を実装したいと思っています
この機能があるとファイルコンテナ内のアドレスとかを考えるときに脳内オフセットしなくていいので、非常に楽です
しかしオフセットをさせるには数字の入力UIを作る必要があり、結構面倒です
とりあえずはカーソル位置を0として扱う というボタン?キー操作?を実装すればいいかな と考えています

後はマーカー機能とジャンプ機能とか

まぁ今のUIだって使いやすいわけじゃないし、欲を言えばきりがないので 程々に色々追加しようと思います


/*
しかし、C#は結構昔から使ってましたが 真面目に使ったことはありませんでした
それでも3日 必要な関数を探しつつ、少しずつ作業してここまで形になるんだなぁ
*/

2014年11月5日水曜日

バイナリビューアを作る(2日目)

マウスクリックでカーソルを移動 クリックしたまま動かして範囲選択 を実装した
それと文字列を表示する関数を変更した

今までの関数では1文字書く毎に数ピクセルずれているような雰囲気があった
ということで新しい関数を作ったのだが、画像の通り、こっちのほうが酷い

一番簡単に解決するにはビットマップフォントを作ればいい
これなら大きさが固定なので並べるだけ

ただ、自分しか使わないとはいえ最低限文字サイズの変更くらいは実装しておきたい
まだ今日は1日の4分の1が残ってるので、文字表示関数を作りこもうと思う

2014年11月4日火曜日

バイナリビューアを作る(1)

暇つぶしとか気分転換を兼ねてバイナリビューワを作り始めました

1日目の作業はこんな感じ

フォームの上下サイズを変更すると表示量が増えます
フォームの左右サイズを変更すると1行に表示できる量が増えます
また0x00を強調して表示する機能を実装しました

既知の不具合としては、スクロールバーの動作がおかしいです
しかしこれはC#側の問題な気もします
しばらくは最低限必要な機能を実装することが重要で、それが終わってから動作確認をすることになると思います
また横幅を変更するとスクロールできる行数も変化しますが、その部分もまだ実装していません

まだ実装していない機能としては、クリックしてカーソルを移動 でしょうか
バイナリエディタではないのでカーソルは必須ではないですが、マーカーとして便利です

他に実装したい機能として、カーソルの位置の表示+オフセットを設定したアドレスの表示
8,16,32,64bitの変数として扱った場合の値の表示
あたりを作りたいと思っています

右側に表示される文字はとりあえずASCIIだけの予定です
文字コードを扱うのは面倒なので


プログラムの作りとしては、上にメニューバー 真ん中にピクチャボックス 右側にスクロールバー という感じです
表示はBitmap Graphicsでリアルタイムに作っています
最終的には必要なときに画像を生成するようにするかもしれませんが、今のところはTimerで一定間隔ごとに作っています
必要なときに生成 の利点はCPUリソースを無駄に浪費しないという点ですが、欠点として「何かイベントがあると必ず呼び出す必要がある」という点があります
チェックボックスを作って、画像生成処理でチェックボックスを参照しているのに、なぜか正常に動作しない と思ったらチェックボックス変化割り込みで画像を更新していない みたいなことが発生する可能性があるわけです


データの読み込みは、一旦全て配列に読み込んでから必要な部分を表示します
なのでデータサイズが数百MBとか数GBになるようなファイルは扱わないほうがいいと思います


現状はこんな感じです
個人的に使いたいだけなので、あまり多機能性は求めませんが、自分が欲しい機能は載せていく予定です
いずれはバイナリエディタ機能も欲しいなぁと思いつつ、メモリ配列の途中にデータを追加って結構面倒なので
ただ表示は中のメモリを表示しているだけなので、置換(上書き)は簡単に実装できる気がします
この辺りはあんまり重要性が高くないのでしばらく放置になると思いますが


とりあえず、表示だけでもまともに動くようになるまでは作り続ける予定です