これを,ASCII の,case-insentive(大文字小文字を区別しない)だけで表すのに,どういった方法が考えられるでしょうか
よくバイナリの表現に使われる,MIME/Base64 は,case-inseintive ではないので使えません
base32,punycode(文字列以外で使えるかわからない),UTF-5(使えるのか?)などがあると思います
試しに base32 で実装してみたら,文字列がかなり長くなってしまう,という問題がありました
>使える文字列は,[a-z0-9]のみ
とすると36通りの文字しか使えないことになりますので、一桁で表せる情報量は最大でも≒5.17ビットです。base32では5ビット、したがって表すバイナリ列に統計的な偏りなどが存在しなければ、何をどう工夫してもbase32で表した場合の
≒0.97倍より短くはできません。base32表記を
かなり長
いとされるのであれば、情報論的にご要望を満たすことは不可能かと思います。
ありがとうございます
要件を書き忘れたのですが,使える文字列は,[a-z0-9]のみとなるため,uuencode は使えません
>使える文字列は,[a-z0-9]のみ
とすると36通りの文字しか使えないことになりますので、一桁で表せる情報量は最大でも≒5.17ビットです。base32では5ビット、したがって表すバイナリ列に統計的な偏りなどが存在しなければ、何をどう工夫してもbase32で表した場合の
≒0.97倍より短くはできません。base32表記を
かなり長
いとされるのであれば、情報論的にご要望を満たすことは不可能かと思います。
ありがとうございます
直感的に考えても,base32 は使える文字列をほぼ全て使ってしまっていますものね...
他のところで工夫してみます
binhexとかだとバイト数が増えるので嬉しくないですよね。
古いのだとs9フォーマットとかあるけどこれも16進数に変換なので倍以上に増えますね。
ちょっとおぼろな記憶ですが、ishフォーマットで特定のスイッチを指定するとアルファベットだけ使ってくれたような記憶があります。
http://www.vector.co.jp/vpack/browse/person/an000019.html
↑こちらにソースもあるので参考になるんではないかと思います。
昔、ASCII文字しか送れないパソコン通信の時代にバイナリを送るためのエンコードかつデータ圧縮と訂正フォーマットが色々あったのでその頃のフォーマットでishファイルは一世を風靡していました。
ありがとうございます
ish も検討しましたが,base32 に比べた場合に,サイズは小さくならないようだったので,検証はパスしました
単純ですが、単に各バイトを2文字の16進数で表現するようにしてはだめですか?
変換後は元の文字列の倍の長さになります。
binhex のことをおっしゃってますでしょうか?
ありがとうございます
直感的に考えても,base32 は使える文字列をほぼ全て使ってしまっていますものね...
他のところで工夫してみます