UNIX / X680x0 Human68k バイナリテキスト変換 ish/uuencode 対応 aish v1.13 1995/02/23 小笠原博之 バイナリとテキストのコンバートプログラムです。ish マルチボリュームエンコー ドが可能になりました。これですべての ish フォーマット、および uuencode された ファイルの相互変換ができます。変換対象範囲に含まれない行を標準出力に書き出す ことができるため、デコードと同時に行える ish カッターとしても使用可能です。 オリジナル ish とフォーマットが完全互換でありながら、デコード時に UNIX や Human68k の長いファイル名、複数ピリオドが含まれるファイル名を、できるだけ自 動復元する機能を持っています。 ●使い方 -- デコード(テキスト→バイナリ) aish [<スイッチ>] [<ファイル名> ..] ish や uuencode で変換されたテキストファイルからバイナリファイルを取り出し ます。データ以外のテキストが含まれていても勝手に判別するので、BBS の log ファ イル等をそのまま与えれば勝手にバイナリファイルを取り出します。1つのテキスト に複数の ish や uuencode が混在していても構いません。ファイル名は一度に複数 記述することができます。(ただし1つのデータが複数ファイルに分割されてる時は 注意が必要 → 後述) <表示> ish展開時の表示 : filename(filesize) デコード経過表示 .. multi-vol ish展開時 : filename(filesize/volume) デコード経過表示 .. uuencode展開時 : filename デコード経過表示 (filesize) <使用例> ・ログファイルからバイナリファイルを取り出す aish dn930704.log ・バイナリ取り出しと同時に ish/uuencode 以外の部分を他のファイルに残す aish -p dn940428.log >> den9404.log 注意: バイナリファイルを取り出す時、そのファイルがすでに存在していて も無条件で重ね書きします! <スイッチ> -p データ範囲以外の部分を標準出力に出力します。リダイレクトして ファイルに落とせば ish カッターになります。ただし、途中で変 換エラーが起こって復元不可能になった場合はファイルの最後まで 出力されない可能性があります。また機能上の問題から ish ヘッダ の 1 行だけは必ず標準出力にも出力されてしまいます。(あとから aish -l で確認できるという利点はある) -A 長いファイル名の自動復元機能を使用せず、常に ish フォーマッ ト情報通りのファイル名で出力します。 -U uuencode のヘッダ判定を行いません。判定はできる限り厳密に行っ ていますが、もし begin で始まる他の行と混乱を起こすようであ ればこのスイッチを使用して下さい。 -f すでに同名の展開ファイルが存在していた場合、別ファイル名にし て取り出します。ファイル名の最後に拡張子 .00 .99 をつけます。 -a -f オプション使用時、ファイル名の最後に .XX を追加します。UNIX 版ではこのスイッチがデフォルトです。 -d -f オプション使用時、ファイル名の拡張子を .XX に置換します。 Human68k 版ではこのスイッチがデフォルトです。 -h -f オプション使用時、ファイル名の最後にではなく先頭に XX をつ けて区別します。元の拡張子を保存したい場合に使えます。 -o ishヘッダにあるファイル名を無視してむりやり出力ファイル名を 与えます(展開中の表示は本来のファイル名になることに注意)。た だし一度にファイル展開が複数行われても、全部ここで指定したファ イルに上書きしてしまうので注意して下さい。-x スイッチと併用 するといいでしょう。またマルチボリュームフォーマット展開時に は指定できません。このスイッチをうまく利用すると、 aish -o - smpl.ish | gzip -dc | tar -xvf - などという使い方ができます。この場合 UNIX なら中間ファイルを 作ることなく一気にアーカイブ展開まですることができます。また ish に変換したあとちゃんとデコードできるかどうか確認するため に、UNIX 版では aish -o /dev/null smpl.ish といった使い方もできるでしょう。 -x 指定ファイルだけを取り出します。与えたテキストに複数のバイ ナリファイルが含まれていても、このスイッチを使えば任意のファ イルだけを取り出すことができます。例えば bbslog.log 中から smpl.lzh だけ取り出したければ、 aish -x smpl.lzh bbslog.log とします。アプリケーションに組み込んで、予め aish -l でリス ト表示させてから任意ファイルだけ取り出すといったこともできる でしょう。(注意:ここでのファイル名比較は大文字小文字を区別し ています) -m テキストから MIME エンコード部分を展開して取り出します。それ 以外の行は標準出力へ。 -- ファイル名自動復元について -- ish はもともと MS-DOS 上で作られたため、ヘッダに含まれるファイル名情報は 8 文字 + 拡張子 3 文字分のスペースしかありません。長い名前のファイルを ish 変換すると、展開した時名前が途中で切れてしまいます。そこでこの aish は、コメ ント行にはちゃんと元のファイル名が残っていることを利用して、Human68k や UNIX の長いファイル名や拡張子の複数ついたファイル名を自動復元します。ish のコメン ト行とは、ヘッダ直前にある "<<< filename ... >>>" という部分です。これは人間 が見るために設けられているもので、通常 ish デコーダーはこれを読み飛ばします。 もちろん、長いファイル名が使えるといっても見ているのはコメント行だけなので、 ヘッダを拡張することもなく ish フォーマット上は完全互換が保たれています。 -- マルチボリュームフォーマットの ish 展開について -- マルチボリュームフォーマットの ish ファイル展開が可能です。分割されている 各パートのテキストをそのまま与えて下さい。全部のパートの展開が終わると正常な ファイルが出来上がります。展開の順番は任意で、各パートがバラバラになっていて も構いません。途中で別のファイルを展開することもできます。ただし、中間ファイ ルは作らずいきなり出力ファイルにオーバーライトしますので、全部のパートが揃う までの間不完全な出力ファイルが存在することになります。一応パート展開毎に出力 ファイルの TOTAL-CRC チェックを行い、展開終わったかどうかの判定を行います。残 念ながらまだ簡易展開の域を脱していませんので、判定も確実とはいえず、どのパー トが届いてないのか調べる機能がありません。 -- 与えるファイルが分割されている場合 -- fj.sys.x68000 への投稿記事など、1つのファイルテキストが分割されている場合 は、コマンドラインからそれぞれ個別に与えても展開することができません。(マルチ ボリューム ish を除く) この場合、順番に注意して1つのファイルに繋げてから渡す か、 cat file1 file2 | aish - 等のように標準入力を利用して下さい。なお uuencode の場合でも、ish と同じよう にデータ行とそれ以外の行を可能な限り区別しますので、unix の uudecode コマンド のように、繋げたファイルの間の不要部分を取り除く必要はありません。 ●使い方 -- エンコード(バイナリ→テキスト) aish -<変換モード> [<スイッチ>] <ファイル名> .. aishmv -<変換モード> [<スイッチ>] <ファイル名> .. ファイルを ish テキストに変換します。必ずコマンド行の最初に変換モードを指定 しなければなりません。一度に変換するファイルを複数書けます。出力ファイルは拡 張子が .ish もしくは .uue とになります。マルチボリューム形式として分割変換す る場合は aishmv を使います。この時拡張子は .iXX となり、XX には変換時のパート 番号が入ります。 <変換モード> -s ish shift-jis フォーマットに変換します -7 ish jis 7bit フォーマットに変換します -8 ish jis 8bit フォーマットに変換します -n ish non-kana shift-jis フォーマットに変換します -u UNIX の uuencode に変換します(拡張子は .uue) <使用例> ・ ish shift-jis で denadv11.lzh をエンコードする aish -s denadv11.lzh ・ ish shift-jis のエンコードで、タイトル行は 50行おきにする aish -st50 denadv11.lzh ・kodenadv3.lzh をおよそ 200 行ごとに分割変換する(マルチボリューム) aishmv -sm200 kodenadv3.lzh 注意: 出力ファイルがすでに存在している場合でも無条件で重ね書きします! <スイッチ> -i ish エンコード時にチェックサム行と余分なヘッダ行を出力しませ ん。エラー訂正が不要だとわかっている通信においてほんのわずか に送信データ量を減らすことができます。フォーマット上の互換性 は取れているので、他の ish デコーダでも復元できます。(注意:エ ラー訂正はできませんが CRCによるエラー判定は行なわれます) -a 出力ファイル名は、元ファイルの最後の拡張子を置換したものでは なく、元ファイル名の最後に .ish/.uue を追加したものにします。 つまり「aish -sa aish098.lzh」とした場合、出力ファイル名は "aish098.ish" ではなく "aish098.lzh.ish" になります。 ~~~ ~~~~~~~ Human68k で TwentyOne.x でたくさんピリオド状態にしている時に 使用すると、ファイル名が混乱せずに便利です。UNIX 版ではこの スイッチがデフォルトです。 -d 出力ファイル名は、元ファイルの最後の拡張子を置き換えたものに します。つまり、-a スイッチと逆の指定をします。Human68k 版は こちらがデフォルトです。UNIX 版で MS-DOS と同じ出力ファイル 名にしたい場合に使って下さい。 -t ish エンコード時にファイルの途中に挿入するタイトル行の間隔を 指定します。デフォルトで 200行です。もし 50行おきにしたいな ら -t50 として下さい。-t0 の時は途中のタイトル行を全く挿入し ません。 uuencode(-u)時は、変換する1行の長さ指定になります。(def.45) -O ish ヘッダに含まれる OSコードを指定します。デフォルトは -O0 です。コードについてはリスト機能のところで説明します。 -m マルチボリューム形式で ish 変換する場合に、それぞれのパートを 何行ずつ出力するかを指定します。デフォルトは -m500 で、500行 ごとに分割を行います。この行指定は、1〜2行の誤差が出る場合が あります。このスイッチは aishmv でのみ有効です。 -o 出力ファイル名を指定します。この指定は、その後のファイル名す べてにおいて有効になります。よってエンコードファイル名を複数 同時に指定する時は、次のように1つ1つ出力ファイル名を指定し て下さい。 aish -so ano1.ish sono1.lzh -o ano2.ish sono2.lzh ↑ | ↑ | └───┘ └───┘ この場合 sono1.lzh は ano1.ish に、sono2.lzh は ano2.ish に 出力されます。つまり直前の -o スイッチが有効になるわけで、も し -o ano2.ish がなければ、sono2.lzh の出力も ano1.ish に重 ね書きしてしまうことになります。アペンドはしません。もし変換 結果を1つのファイルに出力したい時は、 aish -so - sono1.lzh sono2.lzh > sono.ish として下さい。マルチボリュームエンコードの時は、複数のファイ ルに出力する必要性から必ず拡張子が設定されます。 aishmv -so dono1 sono2.lzh この場合、分割数に応じて dono1.i01 〜 dono1.i?? というファイ ルに格納されます。なおマルチボリュームエンコードでありながら 1つのファイルに格納したい場合は、やはり次のように実行するこ とができます。 aishmv -so - sono2.lzh > dono.ish -T マルチボリュームエンコードを行う時のテンポラリパスとファイル 名を指定します。このスイッチは aishmv でのみ使用します。この スイッチがなければ Human では $TEMP/aiSmvTmp.tmp 、UNIX では カレントに作成します。 -x 展開時のファイル名(つまりヘッダに格納するファイル名)を与え ます。このスイッチがない場合は、入力ファイル名のパスを取り除 いたものが使われます。 aish -sx file.lzh dummy.tmp この場合 dummy.tmp から読み込み dummy.ish へ格納しますが、ヘッ ダには file.lzh という名前で書き込みます。展開時には file.lzh になります。uuencode 変換時に標準入力から読み込んだ場合、この スイッチがなければ AishEnc という名前になります。 -c uuencode 変換時、拡張フォーマットとして行チェックサムを出力 します。バイトデータ上の 6bit チェックサムです。 -- マルチボリュームフォーマットの ish 変換について -- ish に変換する場合、マルチボリュームフォーマットとして複数のファイルに分割 することができます。この形式で分割しておくと、展開する時に順番を気にする必要 もなく、また1つのファイルに繋げる必要もありません。マルチボリューム形式で分 割変換するには aishmv コマンドを使いますが、実際の変換は aish が行っています。 展開する時はそのまま aish で実行できます。分割するときの大きさは -m スイッチ で調整できます。分割数は最大 250 までです。 ●使い方 -- リスト (ヘッダのみデコードして情報だけ表示する) aish -l [<スイッチ>] <ファイル名> .. テキストファイルに含まれている ish や uuencode のヘッダを探し、その行位置と 含まれているファイルの情報を表示します。ファイル自体のデコードや判定は行いま せん。表示は ish の場合展開するファイル名、そのバイト数とボリューム番号、タイ ムスタンプ、変換モード、OSコード、そのヘッダの含まれる行番号です。uuencode の 場合はファイル名とその行番号のみ表示します。 <表示> ishの場合表示 : filename (filesize) date time mode os line multi-vol ish : filename (filesize/volume) date time mode os line uuencode : filename line <表示例> aish.lzh (14108) 94/01/11 1:17:18 sjis os:0 line:2 <スイッチ> -A ファイル名の自動復元を使わないで表示します。 -U uuencode 行は出力しません。 通常1つの ish テキストにつきヘッダが3行付くため、このリスト表示でもファ イル毎に同じ情報が3つ出力されます。なぜヘッダが3行あるのかは、おまけ、の 「ish予備知識」を参照して下さい。 <表示情報について> os: OS コードです。以下のような分類が行われています。 0 MS-DOS,Human68k 16 CP/M, MSX-DOS 32 OS-9 48 UNIX 64 Macintosh 254 other OS 255 all OS aish は OS コードによって特に区別を行うようなことはしません。エンコー ド時に OS コードを設定するには -O スイッチを使います。 ●互換スイッチ 他の ish コマンドに慣れた方のための互換スイッチです。通常は特に使う必要はあ りません。 -r デコードモードの指定 -ss SJISエンコードモード (-s と同じ) -s7 JIS7エンコードモード (-7 と同じ) -s8 JIS8エンコードモード (-8 と同じ) -sn non-kana SJISエンコードモード (-n と同じ) ●オプションスイッチについて オプションスイッチは X68K 版でも大文字小文字を区別します。スイッチ記号に '/' は使えません。'/' はパスの区切りとみなします。スイッチは「-s -a -i」と 分けて書いても「-sai」と一緒に書いてもかまいません。引数を取るスイッチの場合 引数とオプションの間にスペースがあってもなくてもかまいません。つまり「-t50」 も「-t 50」も同じです。オプションの順番は任意ですが、変換するファイル名より 先に指定しないと有効になりません。 ●標準入出力 aish は、フィルタとしても使えるよう標準入出力を用いることができるようになっ ています。標準入出力を指定する場合は、ファイル名の代わりに "-" という名前を与 えます。以下、いくつかの例で説明します。 ・デコード時の入力ファイルに使用する cat logfile | aish - これはほとんど意味が無い例ですが、パイプで受け取った入力をそのままデコード します。 ・デコード時の出力ファイルに使用する aish -o - logfile | tar -cvf - この例では、デコードした結果の出力バイナリをそのまま tar に渡しています。 ・エンコード時の出力ファイルに使用する aish -so - aish102.lzh > aish.ish ish sjis に変換した出力のテキストを、リダイレクトして aish.ish に与えてい ます。(これもあまり意味の無い例です) aish -uo - imagemail3.lzh | mail oga これは imagemail3.lzh を uuencode に変換して、そのままメールに出しています。 ・エンコード時の入力ファイルに使用する gzip -c zau110.tar | aish -uo zau.uue -x zau110.tar.gz - gzip で zau110.tar を圧縮すると同時に uuencode に変換しています。また展開 する時の名前として zau110.tar.gz を与えています。 なお、このようにエンコード時のバイナリを標準入力から与えることができるのは uuencode に変換するときだけです。ish に変換する時は標準入力を使うことはで きません。よって aishmv でも標準入力を使用することはできません。 ● UNIX 版の 8bit ファイル名変更機能について MS-DOS/Human68k から UNIX にファイルを持ってきた場合など、展開する時にファ イル名中に漢字が含まれていて困ることがあります。そこでこの aish は、出力ファ イル名に 8bit キャラクタが含まれている場合、勝手に aish_8bit_name.XXX という 名前に置き換えます。XXX の部分は適当な数値3桁です。もし -o スイッチによって コマンドラインから出力ファイル名を指定してある場合は、-o の方が優先されます。 このようなファイル名変換機能が不要な場合は、config.h の CKNAME を 0 にして から再コンパイルして下さい。 ● uuencode について v1.05 から、行チェックサム情報のついた uuencode の拡張形式も使用できるよう になりました。チェックサムは 6bit で、計算方法にはデータ上で行うものと文字上 で行うものとの2種類あります。どちらの形式でも展開することができます。 エンコード時は -c スイッチをつけると、拡張フォーマットとして出力にチェック サム情報も付加されます。この場合はデータ上で計算したチェックサムになります。 これは fj.binaries.x68000 で使われているものと同じ形式です。 ●欠点 展開で訂正不能なエラーが発生した場合、それに続く ish や uuencode ファイルが 認識されない場合があります。どんな ish ファイルが含まれているかは aish -l で 確認できるので、もしそうなった場合は -x オプションを使って1つ1つ取り出すか ファイルを分割してから使用して下さい。 また同様に展開でエラーが発生した場合の出力ファイルは、不完全であってもその まま残します。(実はこれを利用して、旧バージョンの aish でもマルチボリューム フォーマットの手動展開が可能でした) タイムスタンプの時差形式には対応していません。 タイトル行での行数表示をたまに数え間違えることがあります。(動作上まったく 問題はありません) ● Human68k 版での動作速度 動作速度は ish.x よりは確実に速く、条件にもよりますが mic.x よりはわずかに 遅くなります。( sjis エンコードではほとんど差がない) バージョンが古い段階で の比較データのままで恐縮ですが、以下のようになっています。 デコード速度比較例 (RAMDISK上, 10MHz, 506641byteのファイルで約半分がsjis ish,エラーなしの時) mic.x v1.08 : 16.6 (sec.) aish.x v0.92 : 17.1 (sec.) ish.x v1.21 : 32.7 (sec.) ish.x v1.111 : 35.6 (sec.) ish.x UNIXv2.01ベタ移植: 58.9 (sec.) ● Human68k 版の実行ファイルについて このプログラムは gcc + has + hlk でコンパイルされ gnulib.a をリンクしてい ます。著作権はそれぞれのプログラムコードの作者が保持しています。動作は無保証 です。いかなるトラブルにおいても作者は一切責任取りません。 プログラムの配布や利用は自由です。転載時にも作者へ連絡して許可を取る必要は ありません。アーカイブ形式も必要なら変更しても構いません。ドキュメントファイ ルの改変は堅く禁じます。 なお開発は、X680x0(Human v3)上で行いました。 ●配布について Human68k 版のバイナリと UNIX 版のソースは別アーカイブとして配布しています。 バージョン名の後ろに 'x' がつくのが Human 用バイナリアーカイブで、'u' がつい ているのは UNIX 用ソースアーカイブです。UNIX 版のソースも Human68k で ALL-C バージョンとして再コンパイルできます。また Ko-Window のリアルタイム ish エン コーダ koishenc.win も別アーカイブで配布しています。 ●変更点 * は未公開版 0.92 93/06/12 koishenc1.0/1.1版 0.95 93/07/05 初期公開バージョン 0.96 93/07/22* スイッチ形式の変更,koishenc1.2版 0.97 94/01/11 dec時file-write-err check追加,ext無しfileのenc時にゴミが付加 するバグ修正,list表示機能追加,標準入出力file名'-'対応 0.98 94/01/13* UNIXへ移植開始初期版 0.98p 94/01/14 ALLC版作成,-d追加,Mvol展開対応,UNIX対応テスト版として公開 0.98r 94/01/17 デコード時も -o スイッチを有効にした 0.98t 94/01/17 マルチボリューム展開時に終了判定を行うようにした(これで安心) 0.98u 94/01/23* シェルスクリプト ishcat のデバッグ 0.98v 94/03/02 任意ファイルだけの展開(-x スイッチ),UNIX対応テスト版終了 0.99 94/03/02 enc time-stampを間違えるエンバグ修正,ドキュメント修正(おまけ 追加),UNIX版でuuenc対応,1.0公開へ向けてアンケート付き 1.00 94/03/04* OScode指定,UNIX版file情報復元,後回しルーチンを全て追加し一応 仕様上の完成 1.01 94/03/04* オプションスイッチの指定方法拡張,-iでヘッダも削減 1.02 94/03/06* -U 追加,enc 時の -x,enc時も標準入力を使えるよう修正 1.03 94/03/10* UNIX版の8bit ファイル名置換,SysV系対応 1.04 94/03/12* timezone 判定ミスを修正 1.05 94/03/14* ish-mvol enc,uuenc-chksum,Total-CRC/32 対応(Multi-volume 時) 1.06 94/03/16 aishmv で複数ファイル指定可能に変更,スイッチ判定の修正,他 1.07 94/03/26 aishmv 分割行数計算を厳密に,エラー判定ミス修正,-x ishenc対応 1.08 94/03/29 コントロールコードを無視するように変更,-l の mode 表示修正, 内部コードの修正 1.09 94/??/??* ishのタイトル行に表示する行数表示を間違えないようにした 1.10 94/10/16 デコード時 -f,h opt追加,uudecode改良,aishmvのexec失敗を直した 1.11 95/01/26 uuencodeデコードを拡張した 1.12 95/02/20 TooManyErr時crc初期値が戻らないバグ修正 1.13 98/03/19 -m オプション時の Base64 展開を改良 ●参考文献 1)「ish fileのformatの説明と誤り訂正・検出方式について」, M.Ishizuka, ishform2 2) UNIX 版 ish コマンド (UNIX v1.00 , UNIX v2.01) ●連絡先 小笠原博之 (COR.) oga@art.udn.ne.jp (旧: oga@dgw.yz.yamagata-u.ac.jp) ************************************** 【おまけ】 『ish についての予備知識編』 -- これくらいは知っておこう ・そもそも ish ってなに? ish は、バイナリファイル(画像データやアーカイブされた .lzh など、直接 type して見ることのできないファイル) を効率よくテキストファイルに変換する目的で 石塚匡哉氏によって考え出されたものです。例えば BBS のメールで何か画像ファ イルを送ろうとした場合、バイナリメールがサポートされていないところでは何ら かの形で、表示可能文字の集まりであるテキストファイルに変換しなければなりま せん。そのような場合に威力を発揮します。厳密なエラー判定や、ある程度のエラー 訂正ができるのが特徴です。 ・ish の変換テキストについて簡単に教えて (1) <<< vvenc34.lzh 17553 byte (jis7) [265 lines] aish 1.00 >>> (2) !!3G!h9Q!5"XRop%aMInYT&Xp&Rc!("H!&+>st!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ... (3) !!3G!h9Q!5"XRop%aMInYT&Xp&Rc!("H!&+>st!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ... (4) !!3G!h9Q!5"XRop%aMInYT&Xp&Rc!("H!&+>st!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ... (5) "&UGE:BbBl*=!!_O!-!!j;*/9XP%]Ua"k|H'2:ofV6!!P4Tec*5wswJPfvF|