開発

[binllion] 読み込んだデータを16進数で表示する

前回のサンプルデータを画面表示用に16進数表記でStringに変換してratatuiのVec<Line>型に変換する関数を追加してみました。

処理は見ていただければわかると思いますが、折り返し処理の確認のためlenを8にして、一行を8個のデータにしています。

widthの部分は8個の空白を入れていますが将来的にはアドレスを入れる予定です。

pub(crate) fn to_hex(buf: &[u8]) -> String {
    let sep = String::from(" ");
    let hex = buf.iter().map(|x| format!("{:02X}", x)).collect::<Vec<_>>().join(&sep);
    // dbg!(&hex);
    hex
}

pub(crate) fn to_lines(buf: &[u8], len: usize) -> Vec<Line> {
    let mut vec = Vec::new();
    buf.chunks(len).for_each(|x| vec.push(Line::from(format!("{:width$} {}", " ", self::to_hex(x), width = 8))));
    // dbg!(&vec);
    vec
}Code language: PHP (php)

ratatuiのLineとText

ratatuiのLineとTextの違いが当初はわからなかったのですが、データ表示を縦に伸ばすのか横に伸ばすのか、の違いと捉えておけば良いと思います。

Line::from(vec![“abc”.into(), “def”.into(), “ghi”.into(), ]のようにデータを追記していくと同じ行にデータが追加されていきます。つまり横に伸びていきます。

Text::from(vec![“abc”.into(), “def”.into(), “ghi”.into(), ]のようにデータを追記していくと1行目、2行目、3行目と行数が追加されていきます。つまり縦に伸びていきます。

メインパネルの表示はヘッダーと16進数の表示を縦方向に行単位で表示していきたいので、VecにそれぞれをLineにしてVecに入れて、最後にそれをTextに生成するようにしています。

    main_panel_data.push(header);
    main_panel_data.append(&mut self::to_lines(bin_data.buf(), 8));

    let contents = Paragraph::new(Text::from(main_panel_data)).block(block);Code language: PHP (php)

実行イメージはこの様になりました。想定通りで成功です。

と、思ったらヘッダーが0から始まってませんでした。次回以降で修正します。

GitHubにコードをアップロードしています。0.1.0バージョン

コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。

# Example
$ cargo run --example first_stepCode language: Bash (bash)
管理人

Recent Posts

情報セキュリティマネジメント試験取得への道

スキルアップを図るべく情報セキ…

2か月 ago

ファイナンシャルプランナー3級試験取得への道

スキルアップを図るべくファイナ…

2か月 ago

[rust] New Type Patternを使ってみる

DDDの考えを取り入れることで…

5か月 ago

RustでDDDの要素を取り入れてみる

前回SOLID原則というものを…

5か月 ago

期間限定!書籍無料キャンペーン2025

「mdBookではじめるKin…

5か月 ago