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日 必要な関数を探しつつ、少しずつ作業してここまで形になるんだなぁ
*/

0 件のコメント:

コメントを投稿