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<file> ishヘッダにあるファイル名を無視してむりやり出力ファイル名を
                与えます(展開中の表示は本来のファイル名になることに注意)。た
                だし一度にファイル展開が複数行われても、全部ここで指定したファ
                イルに上書きしてしまうので注意して下さい。-x スイッチと併用
                するといいでしょう。またマルチボリュームフォーマット展開時に
                は指定できません。このスイッチをうまく利用すると、

                        aish -o - smpl.ish | gzip -dc | tar -xvf -

                などという使い方ができます。この場合 UNIX なら中間ファイルを
                作ることなく一気にアーカイブ展開まですることができます。また
                ish に変換したあとちゃんとデコードできるかどうか確認するため
                に、UNIX 版では

                        aish -o /dev/null smpl.ish

                といった使い方もできるでしょう。

        -x<file> 指定ファイルだけを取り出します。与えたテキストに複数のバイ
                ナリファイルが含まれていても、このスイッチを使えば任意のファ
                イルだけを取り出すことができます。例えば 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<num> ish エンコード時にファイルの途中に挿入するタイトル行の間隔を
                指定します。デフォルトで 200行です。もし 50行おきにしたいな
                ら -t50 として下さい。-t0 の時は途中のタイトル行を全く挿入し
                ません。
                uuencode(-u)時は、変換する1行の長さ指定になります。(def.45)

        -O<num> ish ヘッダに含まれる OSコードを指定します。デフォルトは -O0
                です。コードについてはリスト機能のところで説明します。

        -m<num> マルチボリューム形式で ish 変換する場合に、それぞれのパートを
                何行ずつ出力するかを指定します。デフォルトは -m500 で、500行
                ごとに分割を行います。この行指定は、1〜2行の誤差が出る場合が
                あります。このスイッチは aishmv でのみ有効です。

        -o<file> 出力ファイル名を指定します。この指定は、その後のファイル名す
                べてにおいて有効になります。よってエンコードファイル名を複数
                同時に指定する時は、次のように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<file> マルチボリュームエンコードを行う時のテンポラリパスとファイル
                名を指定します。このスイッチは aishmv でのみ使用します。この
                スイッチがなければ Human では $TEMP/aiSmvTmp.tmp 、UNIX では
                カレントに作成します。

        -x<file> 展開時のファイル名(つまりヘッダに格納するファイル名)を与え
                ます。このスイッチがない場合は、入力ファイル名のパスを取り除
                いたものが使われます。

                        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|<L\}zY<z ...
                〜略〜
 (6) --- vvenc34.lzh (265/265) ---

  これが変換された ish の最初の部分です。スペースの関係上右側は少々削ってあり
  ます。まず1番最初にある (1) はコメントです。人間が見るために存在します。

  次に同じ行が 3 つ連続しているのがわかります。この (2)〜(4) が ish のヘッダ
  行です。ファイル名やタイムスタンプ、変換モード、といった元のファイルを復元
  するために必要な情報が入っています。3行あるのは 2行までの行落ちに耐えられ
  るようにとの配慮からです。

  そして (5) からがデータ本体になります。ファイルの中身を変換したものです。
  この例では jis7 モードの出力になっていますが、ここに使われる文字の種類は
   ish の変換したモードによって異なります。

  ファイルの途中と1番最後には、何度かこの (6) のような行があらわれます。こ
  れはタイトル行といいます。コメントと同じように人間が見るために存在するもの
  で、データとしては意味を持ちません。このタイトル行を挿入する間隔は伝統的に
  50 行おきにするなることが多いようです。通信速度もかなり向上してきているこ
  とから、aish ではデフォルトで 200行間隔にしています。このタイトル行間隔は
  -t スイッチで変更できます。


・ish 変換の種類の違いは?

  現在4つの変換モードがあります。これは、変換に使用する文字種の違いです。デ
  コードする時は、プログラムが勝手に判別してくれるので意識する必要はありませ
  ん。もちろん使用する文字種が多い方がサイズが小さくなって効率がよいのですが
   7bit しか通さない回線や、漢字コードが sjis と異なる所など、必要に応じて使
  い分けることができます。

   [表] 含まれる文字種の違い
                                ASCII     半角カナ  SHIFT-JIS
                                英数記号  文字      漢字
             ---------------------------------------------------
                ish jis7          ○         ×         ×
                ish jis8          ○         ○         ×
                ish n-sjis        ○         ×         ○
                ish sjis          ○         ○         ○
                uuencode          ○         ×         ×      (参考)

  よって、ish を効率で比べてみるなら sjis > jis8, n-sjis > jis7  となりま
  す。sjis が使えるならできるだけ sjis を使った方が転送バイト数も少なくて済
  みます。jis8 と n-sjis は効率で見るなら同じです。


・ish のエラー訂正能力はどれくらい?

  1ブロックあたり2行までです。たいていエンコードやデコードの時に、ぽこぽこ
  「o」などが表示されますが、これ1つがちょうど1ブロックに相当します。この
  ブロックの大きさはフォーマットによって多少の差があります。もちろん、このよ
  うにエラー訂正情報が余分に含まれている分だけ、サイズが大きくなっています。


・ish のマルチボリュームフォーマットって何?

  メールボックスの容量に行数制限があったりすると、大きなファイルを送ろうとし
  た場合何個にもファイルを分割しなければなりません。また受け取る方も、欠けた
  ファイルがないか確認してから、これを順番に並べて展開しなければならずに不便
  です。そのファイルの分割や結合を勝手にやってくれるのが、マルチボリュームと
  呼ばれるものです。分割もエンコードと同時に勝手にやってくれますし、デコード
  するときも与えるファイルの順番に関係なく展開することができるので便利です。



『素朴な疑問』

・uuencode とは?

  uuencode というのは UNIX のネットワークでよく使われているバイナリをテキスト
  に変換するプログラムです。正確には uuencode というエンコーダプログラムと、
  uudecode というデコーダプログラムとのペアになっていますが、説明中では変換し
  たフォーマットを指す意味でしばし uuencode という言葉を使用してきました。目
  的はほとんど ish と同じです。パソコン通信で使われるようになった ish とは違
  い、こちらは UNIX に最初からついてくることが多いので、まさに標準として扱わ
  れている感じがあります。

  変換が簡単で ASCII 7bit の範囲の文字しか使いません。また ish のようなエラー
  判定や訂正情報も含まれていません。(ただし拡張フォーマットとして行チェックサ
  ムがつくことがあります) そのため符号化のレベルでは ish jis7 より効率が悪い
  にもかかわらず、元のファイルが小さければ uuencode の方が小さい出力になるこ
  とがあります。(ある程度ファイルサイズが大きいと逆転します) この uuencode は
  ネットニュースの fj.binaries.x68000 でも使われています。(パソコン通信で使っ
  ているところもあります)

  余談ですが、もし aish を使って uuencode/uudecode コンパチのコマンドを作るな
  ら次のようになるでしょう。

        alias   uuencode 'aish -uo - -x'
        alias   uudecode 'aish'


・ X68K の mic と ish の違いは?

  この mic というのはみるくさんの作られたコンバータで、X68K ではよく用いられ
  ています。独自の拡張によって Human68k の 18+3 という長いファイル名が保存で
  きる、という点のみ異なりますが、変換はまったく同じです。ただ新しい ish の仕
  様には対応しておらず、non-kana sjis フォーマット、マルチボリューム形式、な
  どは使用することができません。よって旧形式でのみ ish を扱い、長いファイル名
  を扱わないのであれば、サイズも小さく高速で、便利に利用できます。aish 作成時
  も動作確認のためにたいへんお世話になりました。

                                                        1994 3/12 小笠原博之

**************************************