biは、viにユーザーインターフェースを似せて作ったバイナリエディタです。僕が1991年12月にASCII-netにMS-DOS用として載せたのが始まりでした。あれから33年経っています。viにユーザーインターフェースを似せて作られたバイナリエディタは、他に、1996年、linux用にbviというものがGerhard Buergmann氏によって発表されましたが、僕の方が早かったですが、biもbviも、viの編集操作のバイナリファイルへの応用という点では、同じものの別個の発明でしょう。biの最初のバージョンはCによって作られましたが、現在リリースのバージョンは、pythonで書かれています。
ANSIターミナルのエスケープシーケンスを使っているので、ANSIターミナル用です。pythonが動作する、ANSIターミナルのlinux、unix、FreeBSDやPOSIX準拠のOSで動作すると思います。開発環境、動作検証はArchLinuxとFreeBSDでしました。
-tオプションで、-t colorでカラーモード、-t defaultでターミナルの色、-t whiteで、白地に黒、-t blackで、黒字に白を指定できます。何も指定しないとdefaultです。
vi風バイナリエディタ 'bi'
デザイン・開発:Taisuke Maekawa (fygar256)
概要
--------
BIは、UNIXエディタ 'vi' のインターフェースを模倣して設計されたバイナリエディタです。
名前 (BI) は、Binary editor like vI の略称です。viとバイナリ愛好家向けです。
コマンドリファレンス
編集モードのコマンド
<16進キー> ----- データ設定
hjkl または矢印キー ----- カーソル移動
^F ^B ----- 1ページ移動 (256バイト)
^D ^U ----- 半ページ移動 (128バイト)
^L ----- 画面再描画
^Y ----- utf8エンコードのトグル
U,^R ----- リドゥ
^ ----- 行の左端へジャンプ
$ ----- 行の右端へジャンプ
m[a-z] ----- 現在位置をマーク
'[a-z] ----- マークされたポイントへジャンプ
n ----- 次の位置を検索
N ----- 最後の位置を検索
M ----- マークを表示
p ----- ヤンクバッファを貼り付け(上書き)
P ----- ヤンクバッファを貼り付け(挿入)
u ----- アンドゥ
q ----- 終了
x ----- 1バイト削除
Z ----- 書き込み終了
/ ----- コマンドライン検索モードへ
: ----- コマンドラインモードへ
コマンドラインモードの場合
# ----- コメント。'#' の後は無視されます
:: ----- マルチステートメントコマンド区切り。
/<regexp> ----- 正規表現文字列を検索
//xx xx xx ... ----- バイナリデータを検索
!<string> ----- シェルを起動
@<string> ----- python exec()を呼び出す
?<value> ----- 値を10進、16進、8進、ASCII、2進で表示
q ----- 終了
q! ----- 終了を上書き
wq,wq! ----- 書き込み終了
w ----- ファイルに書き込み
w <filename> ----- ファイル<filename>に書き込み
[start],[end] w <ファイル名>指定されたレンジをファイルに書き込む
r ----- 元ファイルを読み込む
t <ファイル名> ----- ファイル名を指定してサイレントモードでスクリプトを実行
T <ファイル名> ----- ファイル名を指定して冗長モードでスクリプトを実行
u ----- アンドゥ (*)
U ----- リドゥ (*)
n ----- 次の文字列を検索
N ----- 最後の文字列を検索
(*) -s/-c(スクリプト実行・単発コマンド実行)モードでも、対話的な画面編集
モードと同じようにアンドゥ/リドゥが記録されます。u/U は同じスクリプト
実行・コマンド実行の中で先に行った編集を戻す/やり直します。
1回の操作が記録できるアンドゥ情報には上限があります。1バイトずつ
書き換える操作では1バイトあたり約96バイトを記録するため、上限が
無いとファイルサイズの数十倍のメモリを使います。この上限を設ける
前は、数十MBのファイルに対する '0,$ ^ ff' のようなファイル全体への
操作が数GBを確保して OOM killer に落とされ、ファイルは書かれず
メッセージも何も出ないまま終了していました。
操作が予算(MAX_UNDO_BYTES、256MiB)を超えると、その時点でアンドゥ
記録を破棄し、
This operation can not undo.
と表示します。操作自体は最後まで実行され、ファイルも通常どおり
書き込まれます。このメッセージは -v が無くても表示され、スクリプトや
'::' マルチステートメントを中断させません。
このとき破棄されるのは今回の操作の記録だけでなく、アンドゥ履歴と
リドゥ履歴の全体です。これは安全のために必要です。バッファは記録の
無い変更を受けているので、古い差分をそこへ逆適用すると別の時点の
内容を書き戻してデータを壊します。以降の編集は新しい履歴を作り
直すので、その後の操作は再びアンドゥできます。
予算は記録した差分の 256MiB で、1エントリあたり
96 + 変更バイト数 * 2 として見積もります。実際には、1バイトずつの
操作(ビット演算、フィル、シフト、ローテート)で約 2,796,202 バイト、
領域単位の操作(挿入、削除、領域上書き)で約 128MiB が目安です。
bi.py と bi.c は同じ見積り式を使うので、同じファイルに同じコマンドを
与えれば必ず同じ位置で上限に達します。ただし実メモリ使用量は異なり、
bi.c は予算とほぼ同じ、bi.py は Python のタプルが C の構造体より
大きいぶん約1.6倍になります。
[offset],[end]rp ---- パーシャルリード
[offset],*[length]rp ---- パーシャルリード
wp ---- パーシャルライトバック(元のオフセットへ)
[offset] ----- アドレスへジャンプ
[offset]m[a-z] ----- 位置をマーク
[offset]R<ファイル名> ----- ファイルを読み込み [オフセット] の位置に挿入
[offset]r<ファイル名> ----- [オフセット] 以降のファイルを読み込み(上書き)
[offset] p ----- ヤンクバッファを貼り付け(上書き)
[offset] P ----- ヤンクバッファを貼り付け(挿入)
[offset]I /<string> ----- 文字列を挿入
[offset]I xx xx xx ... [*<length>] ----- データを length 回繰り返し挿入
[offset]i /<string> ----- 文字列を上書き
[offset]i xx xx xx ... [*<length>] ----- データを length 回繰り返しオーバーライト.
<start>,<end> i /<string> ... - 文字列で埋める(範囲指定)
<start>,<end> i xx xx xx ... - データで埋める(範囲指定)
<start>,<end> f <start2> ----- データ(start~end)をデータ(start2~)と比較する
y/str ----- ヤンクバッファに文字列をヤンク
y//xx xx xx ... ----- ヤンクバッファにデータをヤンク
<start>,<end> d ----- 範囲指定で削除(データはヤンクされます)
<start>,<end> C <dest> ----- <dest>にデータを挿入 (データはヤンクされます)
<start>,<end> c <dest> ----- データをコピー(データはヤンクされます)
[start,end] s /regexp/str ----- 正規表現をstrで置換
[start,end] s /regexp//xx xx xx ... ----- 正規表現をデータで置換
[start,end] s //xx xx xx .../str ----- data1 を str に置換
[start,end] s //xx xx xx ...//xx xx xx ... ----- data1 を data2 に置換
[start],[end] y ----- ヤンクバッファにヤンク
[start,end]|<data> ----- データとのビット単位論理和
[start,end]&<data> ----- データとのビット単位論理積
[start,end]^<data> ----- データとのビット単位排他的論理和
[start,end]~ ----- ビット単位NOT
[start,end]<[[times],[01]] - ビット0,1で左シフト、またはバイト単位回転
[start,end]>[[times],[01]] - ビット0,1で右シフト、またはバイト単位回転
[start,end]<<[[times],[01]] - ビット0,1で左シフト、またはマルチバイト単位回転
[start,end]>>[[times],[01]] - ビット0,1で右シフト、またはマルチバイト単位回転
[start,end] v <dest> ----- データを移動
[start,end] h ----- データダンプ
[start,end] ?s ----- int16(符号付き16ビット整数)表示
[start,end] ?i ----- int32(符号付き32ビット整数)表示
[start,end] ?l ----- int64(符号付き64ビット整数)表示
[start,end] ?us ----- unsigned int16(符号なし16ビット整数)表示
[start,end] ?ui ----- unsigned int32(符号なし32ビット整数)表示
[start,end] ?ul ----- unsigned int64(符号なし64ビット整数)表示
[start,end] ?f ----- float32(32ビット浮動小数点)表示 (*f)
[start,end] ?d ----- float64(64ビット浮動小数点)表示 (*f)
(*f) 浮動小数点は「読み戻すと格納されたビットパターンに戻る最短の10進表現」
で表示します。float32 は float として、float64 は double として往復
判定するので、float32 なら 3.1415927、float64 なら 3.14159265358979 の
ように出力され、表示された数値から元のバイト列を必ず復元できます。
bi.py と bi.c は同じ手順を使うので出力文字列も完全に一致します。
NaN は符号によらず常に 'nan' と表示します('-nan' は出しません)。
_{big|little} ----- エンディアン指定(デフォルトはlittle)
<CR> (コマンドなし) ----- 画面モードに戻る
オプション
usage: bi.py [-h] [options] <file> [options]
Binary editor. Options can appear before or after <file>.
positional arguments:
file file to edit
options:
-h, --help show this help message and exit
-s script.bi, --script script.bi
bi script file
-t TERMCOLOR, --termcolor TERMCOLOR
color scheme: 'black' (white on black), 'white' (black on white), 'color' (multi-color mode);
omit to use terminal default
-v, --verbose verbose when processing script
-w, --write write file when exiting script
-o OFFSET, --offset OFFSET
partial edit: start offset (hex)
-l LENGTH, --length LENGTH
partial edit: length in bytes (hex)
-e END, --end END partial edit: end offset inclusive (hex)
-c COMMAND execute single command and then exit.
備考
範囲指定[start,end]は、'*length cmd'とすると、'.,.+length-1 cmd'を渡したときと
同じ挙動をします。
マルチステートメント'::'は、エラーが起きた時点で処理を打ち切ります。
正規表現は文字列検索に使用できます。
正規表現では、'/' をエスケープ文字 '\' でエスケープできます。
【正規表現の方言について】
bi.py と bi.c は異なる正規表現エンジンを使っており、受け付ける構文が
完全には一致しません。
bi.py ... Python の re モジュール
bi.c ... POSIX 拡張正規表現 (regcomp/regexec)
両方で同じように動くもの(どちらでも動くスクリプトを書くならこの範囲で):
[a-z] [^a-z] . * + ? {n} {n,m} | () ^ $
\w \W \s \S \b (GNU 拡張。両方が受け付けます)
bi.py でしか解釈されないもの:
\d \D 数字・数字以外
\xNN 16進エスケープ (例 \x41)
(?:) キャプチャしないグループ
(?i) インラインフラグ
(?=) (?!) 先読み・否定先読み
*? +? ?? 最短一致量指定子
bi.c は、グループと先読みの形式については 'Invalid regular expression' を
返しますが、それ以外は黙って一致0件になります。中でも \d と \D は要注意で、
bi.c はこれらをただの文字 'd' 'D' として読みます。つまり 'cd\d' のような
パターンが、数字ではなく 'cdd' という文字列に静かに一致してしまい、
エラーも出ません。どちらでも動かしたいスクリプトでは \d ではなく
[0-9] を使って下さい。
bi.c でしか解釈されないもの。bi.py では通常の文字集合として解析され、
別のものに一致します:
[[:alpha:]] [[:digit:]] [[:upper:]] [[:lower:]] [[:space:]]
その他の POSIX 文字クラス
この違いはエラーにならず表に出ません。同じパターンが一方では一致0件、
もう一方では全件一致、ということが起こり得ます。
バイト値をそのまま指定したいときは、\xNN エスケープではなく
バイナリ検索の '//xx xx xx ...' 形式を使うと両方で同じ結果になります。
コマンド内にコメントを記述するには '#' を使用します。'#'含むコマンドは、
エスケープ文字 '\' を使って記述する必要があります。
コメント除去はコマンド解析の前に行われるため、置換文字列として '#' を
単独で書くと除去されて置換文字列が空になります。このとき bi.c は
'Syntax error: Missing replacement pattern.' を返し、bi.py は空置換
(削除)として実行します。リテラルの '#' が必要なときは '\#' と書いて下さい。
マルチステートメントのコマンド区切りは'::'です。リテラルの'::'を使いたい時は、'\::'とエスケープします。
上記のコマンドで現在位置を省略値とする場合は、`[]` で囲まれた値は省略できます。
's','h'コマンドは例外で、<start>,<end>を省略すると、ファイル全体に作用します。
値 <end> は、'*<length>' を使って、<end>=<start>+<length>-1 のように渡すことができます。
コマンドラインでは、次のように単純な式で値を指定する必要があります。
<expression> := <factor> | <factor> [+|-] <factor>
factor は、16 進数、または先頭に '%' が付いた 10 進数の数値です。('*' ではありません)
また、マーク位置として '[a-z]、 ^をファイルの最初、.を現在の位置、
$ をファイルの末尾として扱います。
■コマンド先頭の '^' について
'^' はビット XOR コマンドの範囲省略形でもあるため、コマンド先頭の
'^ff' は「ファイル先頭に続く ff」ではなく「カレント位置のバイトを
0xff と XOR する」という意味になります。
コマンド先頭の '^' がファイル先頭アドレスとして読まれるのは、次の
非空白文字が ',' '+' '-' か、コマンドの終わりであるときだけです。
それ以外の位置(',' の後や '+' '-' の後)では常にアドレスです。
^,$ h ファイル全体をダンプ ('^' はアドレス)
^+4,$ h 4 から末尾までダンプ ('^' はアドレス)
^ 先頭へジャンプ ('^' はアドレス)
^ff カレントバイトを XOR ('^' は XOR コマンド)
0,7^ff 0..7 の範囲を XOR ('^' は XOR コマンド)
XOR のデータは16進バイト列なので、XOR の形で '^' の直後に ',' '+' '-'
が続くことはありません。既存の XOR コマンドの意味は変わりません。
部分編集モードでは '^' は読み込んだ窓の先頭アドレスになるので、
窓全体を指すには '^,$' と書きます。
Pythonのeval()式も'{}'で括って値として渡すことができます。
例えば、{0xff^0x55}のようにです。
'{}'の中で、ファイルの内容の1バイトは、mem[x]で取得することができます。xには、cpとして、カレントポジションを指定することができます。
【重要】'{}'内の mem[x] と cp は bi.py にのみ当てはまります
bi.py は {} を eval(expr, globals()) で評価するため、mem[] と cp は
本物のグローバル変数として上記の通り使えます。
bi.c の {} は、過去にあったコマンドインジェクションの穴を塞ぐために
数字・16進文字・演算子・括弧のみを通す、より制限の強いパーサで評価
しています。mem[x] や cp を使うと不正な式として拒否されます。bi.c は
現在「アドレス省略」と「アドレス指定が拒否された」を区別していない
ため、エラーは出ずに、意図したアドレスの代わりにカレントポジション
へ静かにフォールバックします。-w を付けていればそのまま書き込まれて
しまいます。
bi.c では {} の中身を {0xff^0x55} のような単純な算術式にとどめて
下さい。mem[x] や cp を {} 内で使うスクリプトは bi.py で実行して
下さい。
^Lは、utf-8のマルチバイトを扱う境界を0から3の間でスイッチします。
もし、utf-8のマルチバイト文字が正しく表示されなかったら、数回^Lを押して下さい
^Yは、utf-8のエンコードを禁止、または許可のトグルをします。もし、utf-8の
エンコードで画面が乱れるときは、禁止することができます。初期値は禁止です。
スクリプト機能
bi にはスクリプト機能があります。
bi スクリプトの名前は 'file.bi' です。スクリプトファイルの指定のコマンドライン構文は、'bi [-v] -s file.bi targetfile' のようになります。
Python exec()
Pythonのexec()はチューリング完全なので、全ての処理が'@'
コマンドで書けます。
例:0~255の値を持つ1024バイトは次のようにして生成できます。
@for i in range(1024): setmem(i,i%256)
'@'コマンドは物理的に1行に収める必要があるため、複合文は上のように
1行スイートで書くか、内包表記で書いて下さい。
@[setmem(i,i%256) for i in range(1024)]
importをすると、そのモジュールは、biのグローバル空間に置かれます。
【重要】この節は bi.py にのみ当てはまります
'@'コマンドからの編集バッファへのアクセスは bi.py の機能であり、
bi.c にはありません。
bi.py ... exec(code, globals()) でコードを実行します。編集バッファと
カレントポジションは実行中のプログラムの本物のグローバル変数
なので、setmem() / mem[] / cp がそのまま使えます。import した
モジュールも次の '@' コマンドまで残ります。
bi.c ... コードを一時ファイルに書き出し、別プロセスの python3 で
実行します。そのプロセスは編集バッファと何のつながりも
持ちません。setmem() / mem[] / cp は NameError になり、
編集中のファイルは変化せず、次の '@' コマンドにも何も
引き継がれません。
したがって bi.c での '@' は、汎用的な Python 実行(計算する、表示する、
外部ライブラリを呼ぶ)としてのみ使えます。'@import sys; print(sys.version)'
のような普通のコードは両方で同じように動くため、この違いには気づき
にくくなっています。Python からバッファを操作するスクリプトは bi.py で
実行して下さい。
部分編集
-o, -l, -e オプションで部分編集モードになります。値はすべて16進数です。
('-b' というオプションはありません)
-o <offset> 開始オフセット
-e <end> 終了オフセット(その位置を含む)
-l <length> バイト数。-e の代わりに使えます
bi sample -o 100 -e 1ff
bi sample -o 100 -l 100
どちらも sample の 0x100 から 0x1ff までを編集します。'wp' で元の位置に
書き戻します。
■アドレスは元ファイルの絶対値です(窓の先頭からの相対ではありません)
コマンドラインで指定するアドレスは、読み込んだ部分が元ファイルで持って
いたアドレスをそのまま使います。画面に表示されるアドレスも同じです。
'-o 100 -l 10' なら窓は 0x100〜0x10f なので、窓全体は
100,10f h
であり、'0,f h' は同じ意味にはなりません。0 と 0xf は窓の外です。
窓の外のアドレスは
Invalid range.
として拒否され、コマンドは実行されません。以前のバージョンはこれを窓の
先頭へ丸めていたため、'0,f i aa' が 0x100 の 1 バイトだけを書き換え、
16 バイト埋めたつもりの利用者に 15 バイトが捨てられたことを何も知らせずに
済ませていました。範囲の開始・終了に加え、'c' 'C' 'v' 'f' の転送先
アドレスも検査します。bi.py と bi.c の動作は同一です。
窓の末尾を超えて許されるのは offset+length の位置だけです。窓の末尾へ
データを追記できるようにするためです。
なお '$' と '.' は最初から窓のアドレスに解決されますが、数字の 0 は
そうではありません。'0,$ h' は 0 が窓の外なので拒否されます。窓全体を
対象にするには、範囲を書かない('h')か、絶対範囲を書いて
ください('100,10f h')。
ファイル末尾を超える範囲はファイルサイズに切り詰められ、末尾以降を
開始オフセットに指定した場合はバッファが空になります。
'?Q'(float128)は両者で一致せず、間違っているのは bi.py の方です。
bi.c はプラットフォームの long double をそのまま読みますが、bi.py は
ctypes.c_longdouble を経由しており、その .value は通常の Python float
(double)なので、表示前にすべて double へ丸められます。double の範囲外の
値は本来の大きさではなく -0.0 や -inf として出ます。'?Q' を使うときは
bi.c を使ってください。なお 'float128' はそのプラットフォームの long
double を指すゆるい呼称で、x86-64 では80ビット拡張、aarch64 では128ビット
四倍精度、環境によっては単なる double です。'?Q' の出力はマシン間でも
可搬ではありません。
'<start>,<end> i <data> *<n>'(範囲指定と繰り返し回数の併用)は仕様として
定義されていない書き方で、両者の挙動が異なります。bi.c は '*<n>' を
繰り返し回数として n 個分だけ書き込み、bi.py は '*<n>' を無視して範囲
全体を埋めます。どちらか一方の書き方だけを使ってください。
高速化
biを高速化する必要があったら、pyinstallerというpythonコンパイラでコンパイルすることができます。pyinstaller --onefile bi.py
危険
'@'コマンドで、無闇にbiのグローバル変数を書き換えると、システムがエラーを
起こし、予期せぬ動作をすることがあります。biのグローバル変数をいじるときは
十分注意して下さい
これは '@' が実行中のプログラムのグローバル変数を共有する bi.py の話です。
bi.c では別プロセスで実行されるためこの形でエディタを壊すことはありませんが、
同じ理由でバッファを編集することもできません。
------ 履歴 -----
1991-12-4 ハードディスクのバックアップに使っていたフロッピーディスクのセクタが失われました。
1991-12-5 仕方なく DUMP と C プログラムを使ってファイルを修復しました。
1991-12-6 ファイルエディタの作成を開始しました。これが「急いで」という意味です。
1991-12-7 コーディング。
1991-12-8 コーディング。
1991-12-9 とりあえず完成。
1991-12-10 ディスクがいっぱいになった場合のエラーチェックを追加しました。
1991-12-20? ASCII-pcs junk.test に投稿しましたが、メンテナンスによりすぐに削除されました。
1992-01-18 q、q!、wq を区別しました。bi に名前を変更しました。
1992-01-23 ドキュメントを書き直しました (バージョン 0.9999)
1992-02-05 wq のバグを修正しました (バージョン 0.99992)
1992-02-10 メモリ割り当てエラーのバグを修正しました (バージョン 0.99998)
^D、^U コマンドを追加しました
--- Linux 版は以下の通りです。
2025-03-29 バージョン 1.98
2025-03-30 バージョン 1.989 デバッグ情報、x コマンド、M コマンド、' コマンド、m コマンドを追加しました。
2025-03-31 バージョン 1.9893 コマンドラインコマンドを追加しました。!、w、q、wq、wq!、w<file> コマンドを追加しました。
2025-04-01 バージョン 1.98951 y、d、p、P コマンド追加
2025-04-02 バージョン 1.98953 r、R コマンド追加
2025-04-02 バージョン 1.98955 i、f コマンド追加
2025-04-02 バージョン 1.9896 c、m コマンド追加
2025-04-03 バージョン 1.9897 s、S、w コマンド追加
2025-04-03 バージョン 1.9899 /、?、N、n コマンド追加
2025-04-03 Linux 版がほぼ完成しました。
2025-04-04 バグ修正完了。バージョン 2.0
2025-04-11 バージョン 2.1 若干の調整。
2025-04-12 バージョン 2.2 正規表現をサポートしました。
2025-04-12 バージョン 2.3 u コマンドを追加しました。
2025-04-12 バージョン 2.4 統一表記のため '?' を '//' に変更しました。
2025-04-13 バージョン 2.5 a コマンドを追加しました。
2025-04-13 バージョン 2.5.5 統一表記のため 'u' を 'y' に変更しました。
2025-04-13 バージョン 2.5.7 シェル呼び出しのバグを修正しました。
2025-04-13 バージョン 2.6.0 &,^,|,~ コマンドを追加しました。開始パラメータと終了パラメータを取得するための調整を行いました。
2025-04-13 バージョン 2.6.9 将来のスクリプト表記と検索コマンドの調整のため 'm' を 'v' に変更しました。
2025-04-14 バージョン 2.7.0 スクリプト機能を追加しました。
2025-04-14 バージョン 2.7.3 若干の調整
2025-04-14 バージョン 2.8.0 簡単な式機能の追加と若干の調整
2025-04-14 バージョン 2.8.3 コマンドラインパラメータで <end> 値を渡す際に '%' プレフィックスを追加し、若干の調整
2025-04-14 バージョン 2.8.5 rotate コマンドと shift コマンドを追加しました。
2025-04-15 バージョン 2.9.1 マルチバイトシフトと回転のバグを修正
2025-04-15 バージョン 2.9.5 コメントのバグを修正
2025-04-15 バージョン 2.9.6 若干の調整と 'o' コマンドを追加しました。
2025-04-15 バージョン 2.9.7 若干の調整と 'O' コマンドを追加しました。
2025-04-16 バージョン 3.0.0 ファイル書き込みフラグ(lastchange、modified)のバグ修正
2025-04-19 バージョン 3.0.1 コマンドラインパーシングのバグを修正、若干の調整。
2025-04-19 バージョン 3.0.2 iコマンドのバグ修正。
2025-04-20 バージョン 3.0.3 write file時のパーミッションチェックを付ける
2025-04-20 バージョン 3.0.4 viに準じるためにコマンド名変更、若干の調整
2025-04-20 バージョン 3.0.5 バグ修正
2025-04-21 バージョン 3.0.6 正規表現バグ修正
2025-04-21 バージョン 3.0.8 正規表現検索高速化
2025-04-23 バージョン 3.0.9 'd'コマンドバグ修正
2025-04-24 バージョン 3.1.0 データを16,2,8,10進、ASCII-CODEで表示する機能を付ける
2025-04-24 バージョン 3.2.0 日本語用に3バイトまでのutf-8のマルチバイトを扱えるようにする
2025-04-26 バージョン 3.3.0 メモリオーバーフローのエラーチェックを付ける
2025-04-26 バージョン 3.3.1 メッセージ出力を標準とエラー出力に分ける
2025-04-26 バージョン 3.4.0 pythonのeval()式を'{}'で括って値として渡せるようにする
2025-04-26 バージョン 3.4.1 (eval()式などを)10進、16進、8進、ASCII、2進で表示する機能を付ける
2025-05-01 バージョン 3.4.3 '{}'の中で、mem[x](編集しているファイルの1バイト)と、cp(カレントポジション)を指定することができるようにする。'@'コマンド追加。
2025-05-04 バージョン 3.4.3.5 pythonとの記法統一のため調整。
2025-05-04 バージョン 3.4.4 utf8サポート(full)追加。
2025-05-09 バージョン 3.4.4.7 stable.
2025-05-09 バージョン 3.4.4.7rel14 少しバージョンアップ。fコマンドとiコマンドの統合。
2025-12-28 バージョン 3.4.4.8 i/Iコマンドとo/Oコマンドの統合
2026-02-26 バージョン 3.4.5.12 undo/redoコマンド対応、サーチコマンドのハイライト対応
2026-03-01 バージョン 3.4.5.13 部分編集機能を追加。
2026-03-04 バージョン 3.5.1.0 データ比較機能を追加。
2026-03-11 バージョン 3.5.1.25 型指定データ表示機能追加。
2026-06-21 バージョン 3.5.1.81 -cオプション、xコマンドを追加。
2026-06-22 バージョン 3.5.1.86 xコマンドをhに改名、error exitを整備。
2026-06-23 バージョン 3.5.2.6 マルチステートメント対応。
2026-09-02 バージョン 3.5.3.0 アンドゥ記録量の上限を追加。
2026-09-02 バージョン 3.5.3.1 浮動小数点を最短往復表現に変更、
bi.c と bi.py のメッセージ文言を統一。
2026-09-02 バージョン 3.5.3.2 部分編集で窓の外のアドレスを窓の先頭へ
丸めるのをやめ 'Invalid range.' に変更、
'?' の値表示書式を bi.c/bi.py で統一。
2026-09-02 バージョン 3.5.3.3 '^'(ファイル先頭)をコマンドラインの
アドレスとして使えるよう修正。'^<data>'
の形は従来どおり XOR コマンド。
--------------------
このプログラムを適用した結果については一切責任を負いません。
GitHub リポジトリ
インストール&実行
#### installation (others)
git clone https://github/fygar256/bi/
cd bi
chmod +x bi.py
sudo cp bi.py /usr/bin/bi
sudo cp bi.1.gz /usr/share/man/man1/
sudo mandb
#### execution
bi file
デバッグ協力
パシフィックソフトウェア開発(株)
スクリーンショット
マスコットキャラクター
