
単純分割とは乱暴にいうと、ファイルをそのまま複数にぶった切りした感じの分割形式です。
ある日、あなたは妙なファイルを入手しました。
以前mixiの偽装解除コミュでも話しが出たのですが、
「ちょっと変わった」といっても、別にあややが変な格好で街中を歩いているとか
ふと思ったのですが、書庫ファイルというのがありますよね。
自分が最初に暗号化ツールをインスコしたのは、確かKremlinだったと記憶しています。 東アジアのあの国とか中東のその国とかアフリカ大陸のこの国とか中米のどの国とか、
某国が名指しで非難している国々の名前が記載されていた記憶があります。
その時の自分の気持ちは、多分・・・こんな感じ
ビクッ. ∧∧ ∧∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Σ(゚Д゚;≡;゚д゚) < うお!なんかすごいところに迷い込んじまったぞゴルァ! ./ つ つ \______________________ 〜(_⌒ヽ ドキドキ )ノ `J
正確にいうと偽装ではありませんけれど・・・
えーと、実は自分自身がよくわかっていません(^(家)^;)ゞウヒャ
回して溢れた右端の値「0」がぐるっと反対側に移動して左端の位置に入りました。
上下で1と1、0と0というように合致しているところは、結果が「0」になっています。
埋め込みの中にはBremen等のように、その前後でファイルサイズが全く変わらず、
さて、上のイメージの横の列、RGB3ビット分をビットプレーンと呼びます。
【お断り】 それでも見てやるぞ!という方のみこちらをクリック下さい。
・・・開いちゃいましたね。。。でわ、覚悟を決めて見て頂きましょう(笑 いきなり私事で恐縮ですが、うちの子供達は浜松に本社がある 某三連音叉印の音楽教室に通っています。 それを踏まえた上で、この間の風呂の中での会話です。 子(息子): (風呂桶を叩きながら)ココココ「8分音符っ!」(倍テンポで)ココココ「16分音符っ!」 父(おいら): 「その次は?」 子: 「うーん?」 父: 「16×2は?・・・16+16でもいいけど。」 子: 「・・・32分音符っ!」 父: 「その次は?」 子: 「えーっ?あるの?そんなの。」 父: 「あるよ。同じようにやってみ。」 子: 「・・・64分音符っ!」 ・・・そうして、このお調子者の親子は延々と2048分音符辺りまでやったのでした^^; で、途中で父はハタと気が付いたのでした。(途中で気付けよ>父) 「そういえばこの音符の分割数って、よくPCに出てくる数だよなぁ。」 いや、実際問題として譜面で見るのは32分音符、せいぜいヒゲ四つの64分音符位までです。 まあ、あくまで理論上の音符ということで。 (そんなに細かくするんなら、テンポを倍にして一つ長い音符で記譜した方が楽だしw) 8、16、32、64、128、256、512、1024なんてのはPC扱う上でよく見かける数字ですよね。 多分、ここを見ている人の中には、1000より1024の方がスッキリした数字だと思う人も居るハズ。 (そこの貴方ですよw m9(・∀・)ビシッ!!) さて再び私事です。(年寄りの話しはやたら長いので注意w) 自分は昔バンドやってて、ベースやらギターやら弾いていました。 でバンドとは別に、ミニキーボートとKORG製の弁当箱位の大きさのシーケンサーを使って いわゆる「打ち込み」というもので遊んでいました。 そんな事をしているのを知っていた職場の人が、「こんな本もあるよ。」と教えてくれたのが、 コンピュータ・ミュージック専門誌でした。創刊間もないCMM誌です。 それには毎月MS−DOS上で動くシーケンスソフトの体験版が付いていました。 それが自分とパソコンとの出会いです。(オフコンは除く) 世はローランドの「ミュージ郎」などのパッケージDTMセットが発売され出し、 MS−DOSも3.3Cで、PCスペックも日電の16ビットPCといったご時世でした。 いまとなってはアレなスペックですが、こうして自分はPCを使い出したのです。 さて、タイトルに戻って「音楽の数値化」ですが、忘れてならないシーケンスソフトがあります。 カモンミュージック社の「レコンポーザ」シリーズです。 PC88の頃より存在する数値入力に特化したmidiシーケンスソフトです。 DOSからウィンドウズの切り替わりの時に、従来の操作感を維持出来ずに(←あくまで私見ですが) 今では幻のソフト(販売は現在も行われているようです)となってしまった感がありますが、 製作現場では、そのスピーディな入力方法により未だにDOS版使用者も結構いらっしゃるようです。 自分もメインで使っていましたが、音符入力型のシーケンスソフトよりも判りやすく、 編集も楽なソフトでした。非常にデータの見通しがよかったのです。 拡張子midが標準的midiデータになる前は 拡張子rcpが事実上の標準的midiデータだったのです。 他のシーケンスソフトの数値入力は、このソフトがベースとなっています。 レコンポーザの入力はこんな感じでした。 確かVer2.5F辺りからタイムベースが48から480に引き上げられましたが、ここでは48で表記します。 (※タイムベース=分解能、通常四分音符を表現するために要する値)
ステップタイムは音符の長さを表します。 (厳密にいうと「次のコマンドまでの長さ」なのですが、ここでは便宜上こう記述します。) 一般に48は四分音符で24は八分音符です。(別に自由に設定してもよいです。) 0というのがありますが、これは次の音符まで0、つまり次の音符との和音を表します。 ゲートタイムは、実際に発音している時間です。 というように、音楽って結構数値化しやすい要素があります。
・・・まるで週刊誌か「ムー」(←まだあるのかな?)の見出しのようなタイトルにしてしまいました。(汗
影武者に標準添付されているダミーファイルに「kage.zip」というのがあるのですが、 続きを閲覧される方はこちらをクリック下さい。
解凍手順を一覧にするとこんな感じになります。
で、list.txtの中身は↓です^^;
解凍後半戦になるとGUIベースでなく、ほぼCUIベースのツールで解凍する事となりました。 (-(家)-)y-~~DOS窓ナツカシカッタヨw この作業の為に、新たにツールを2個程探してきたのは秘密ですw
Base64というのはテキスト変換の一種で、規定されたASCIIに符号化するアルゴリズムの一つです。
000000 が「A」で1ビットずつ増加していき、
他に似たような形式に下記のようなものがありますので参照下さい。 ○UUencode Base64の基礎となったとの事で、Unixでは昔から存在している形式のようです。 こちらも6ビット単位で変換で、割り当てられる文字が下記の64種類です。 『`!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_』 6ビットの値に20hを加算(もし加算後20hならば60hとする)します。 つまり000000は20hで60hに読み替えられ、000001は21h、111111は5Fhとなります。 これは文字コード表の順番に対応します。(但し60hの「`」が最後でなく最初になります。) 3オクテット(8ビット×3)単位で変換しますので不足分は00hを補填します。 「begin」で始まり「end」で終わり、拡張子も.uueや.uuというパターンが多いです。 ○Base64url Base64に使用されている「+」と「/」はURLやファイル名やパス名において特殊な存在です。 エンコード後の文字列が誤動作を引き起こさないよう「-」と「_」に差し替えられたものです。 ○Q-Encoding(Quoted Printable) 元から殆どがUS ASCIIで構成されているファイルの場合だと、 逆に局所的に存在する他の部分を変換した方が効率的である場合があります。 基本的にUS ASCII部分は無変換で、それ以外の部分は「=AA」のように=の後に16進表記します。 これにより「=」は変換部分として扱われるため、文字としての「=」は「=3D」として表記されます。 空白や制御文字や一部文字も「=○○」の形で変換します。 ○basE91 Eは大文字で表記するのが正しいそうです。 こちらは記号部分が追加されて全部で91種類の文字が割り当てられています。 『ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"』 Base64より変換効率は良好です。 (2008/03/28 追記) 最近、"base91 デコード"でぐぐってここに辿り着く方も多いようですので、 もうちょっと詳しい記事を追加します。 basE91の変換後の文字列は、印字可能な94種類のASCII(0x21から0x7E)のうち、 「'」(0x27)、「-」(0x2D)、「\」(0x5C)の3つをを除いた91種類で構成されています。 変換表はこんな感じです。
変換の仕方の概要は、変換対象部分を91で割って得た整数の商と剰余の値を、 上の表に当てはめてASCIIにそれぞれ変換します。 変換後は、商の部分と剰余で合せて2つのASCIIが得られる事になります。 例えば変換対象部分の値が1347だとしたら、 1347÷91=14と余りが73なので、まずは14と73という値が得られます。 これを上の表で変換してみると、14は「O」(0x4F)と73は「/」(0x2F)になります。 さて、変換対象範囲はどのように区切られているのでしょうか? Base64の場合だと、データを6ビットずつ区切っていました。 6ビットは000000から111111までの丁度64通りです。 また、3オクテットの内容が丁度4バイトに変換されるので解りやすいです。 しかし、basE91は91通りに変換します。 0から90までの91通りというと、90はビット換算すると1011010となり、 Base64に比べるとなんだか中途半端な感じがしますね。 ここで、先程出てきた割り算が登場します。 結論から先に書くと、basE91は基本的に13ビットずつ区切って変換します。 13ビット全てが1なら 1 1111 1111 1111 で、10進だと8191になります これを91で割ると90となり、商も変換表にきっちり当てはめる事が出来ます。 (剰余の方は91で割るのだから、90を超える事はありません。) ただ、剰余の方は1になる(8191-90×91=1)ので、まだ89も余裕があります。 14ビット目もちょっと変換範囲の区切りの中に入れてもいいかもしれません。 8191+89(または90×91+90)=8280で、これが1サイクルで換算出来る最大値です。 ビット換算すると10 0000 0101 1000になり、これを超えてはいけません。 という事は、14ビット目に0が来るか1が来るかはやってみないと判らないので、 仮に14ビット目に1がきても8280を超えないように、 13ビット目までの値に注目して制限を設けた方がよさそうです。 先程の最大値は14ビット目が0ならば00 0000 0101 1000となり、88になります。 という事は逆に言うと、13ビット目までで88を超えなければ、 無条件に14ビット目も変換範囲対象に入れても問題ないようです。 14ビット目に1がきても8280を超えないし、0がきてもそのまま使えばいいのです。 このようにして、13ビット目までで88を超える場合は13ビットを対象範囲とし、 88を超えないようなら14ビットまでを対象範囲として区切って変換します。 また、上の方で「Base64より変換効率は良好です。」と書きました。 Base64が変換後は約1.33倍の増加でしたが、basE91はどうでしょう? 13ないし14ビットの変換対象が2バイト、つまり16ビットに変換されます。 仮に変換対象が全て13ビットで変換されれは16÷13で約1.23倍、 全て14ビットで変換だと16÷14で約1.14倍になります。 元データが1MBのものをBase64とbasE91で変換して増加量を比較してみます。 仮にbasE91での変換が全て14ビット単位で出来たと仮定したら、 理論上、1MB×(0.33-0.14)で0.19MB、詳しく書くと199,230バイト程差が出ます。 アルゴリズムをBase64からbasE91に変えるだけで、これだけ差が出るのです。 では、実際に変換例を見てみましょう。 尚、ここでは複数バイトの並びは、電卓の進行方向が←に向かいますので、 … 3バイト目 2バイト目 1バイト目 のように接続した形で表記します。 サンプルはjpegヘッダ風味な感じの11バイトのバイナリで、 内容は FF D8 FF E0 00 10 4A 46 49 46 2B です。 ![]() 1バイト目のFFはビットだと 1111 1111 、2バイト目のD8は 1101 1000 です。 これを接続すると、1101 1000 1111 1111 となります。 まずはこれから13ビット区切ります。右端から←方向に13ビット取ると、 1101 1000 1111 1111 で 1 1000 1111 1111 となります。左側の110は次の変換に回します。 この 1 1000 1111 1111 を10進にすると6399になります。 これは88を超えているので、ここの部分の変換対象範囲は13ビットになります。 そして、6399を91で割ると、商は70で剰余は29です。 これを上の換算表に当てはめると、70は「+」(0x2B)、29は「d」(0x64)となります。 さて商と剰余、どっちを先に並べるかというと、剰余の方が先に来ます。 ですので、変換後の奇数バイトは剰余の値、偶数バイトは商の値に対応します。 つまり、変換後の1バイト目が「d」(0x64)、2バイト目は「+」(0x2B)となります。 ここまでが基本的な変換手順の1サイクルです。 次に、先程使われずに残った14〜16ビット目の 110 、 そして次の3バイト目のFF(1111 1111)、4バイト目のE0(1110 0000)を並べます。 1110 0000 1111 1111 110 から13ビット取り出して 0 0111 1111 1110 です。 10進だと2046ですので、これも13ビットのまま変換します。 2046÷91=22と余り44ですので、22は「W」(0x57)、44は「s」(0x73)、 変換後の3バイト目が「s」(0x73)、4バイト目が「W」(0x57)です。 どんどん続けましょう。 残った 1110 00 、5バイト目の 00(0000 0000)、 並べると 0000 0000 1110 00 から13ビット取り出して 0 0000 0011 1000 です。 これを10進にすると56です。 ここで初めて88を超えない値が出て来ました。 ですので、ここは改めて14ビットを取り出して対象範囲を区切り直します。 先程使わなかった14ビット目の 0 を追加して 00 0000 0011 1000 にします。 …まあ、この場合の値そのものは88で変わらないのですが、 わずか1ビット分ですが変換効率が上昇した事、 なによりも、それ以降の区切り位置のズレに大きく影響しますので、 これは大きい変化と言えると思います。 56だと商が0、剰余が56となりますので、0が「A」(0x41)、56が「4」(0x34)、 変換後の5バイト目が「4」(0x34)、6バイト目が「A」(0x41)です。 さて、パターンも分かってきたと思うので、残りは一気にやってみましょう。 本来であれば、上のように1つ1つ確認して、サイクルとして行うべき行程ですが、 長くなるので、複数サイクルをまとめて記述したものである事をご理解下さい。
複数バイトの並びを逆にして、13ビットずつ区切ります。
10進にします。
今回88を超えなかったのは、丁度末尾に当たる部分の86だけでした。 しかし、これ以上変換する対象はもうないので、ここはこのまま変換します。 (尚、basE91にはBase64のパティング「=」のような概念はありません。 商と剰余を算出します。
換算表に当てはめます。
分りやすいように並び替えてみます。
これで一通りの変換が完了しました。 結果を順番に並べていくと、 d+sW4Acc!cnx{A (64 2B 73 57 34 41 63 63 21 63 6E 78 7B 41) という14バイトのASCIIが得られました。 さて、本当にこの計算で合っているのでしょうか? そこで実際にデコーダを使って変換して確認をしてみましょう。 ![]() 最後に 0x0D 0x0A の改行が付加されていますが、 変換そのものは無事ちゃんと合致しているようですね。 めでたし、めでたし♪ (追記ここまで) ○Base32 5オクテット単位で5ビットずつ変換します。割り当てられる文字は下記の32種類です。 『ABCDEFGHIJKLMNOPQRSTUVWXYZ234567』 パディング(補充される文字)としてBase64同様「=」が使用されます。 英大文字と数字のみで、英小文字は出現しません。 ○Base32hex Base32と同様ですが、割当が下記のようになっています。 『0123456789ABCDEFGHIJKLMNOPQRSTUV』 文字コード表の順番に並んでいます。ソート後の順番に配慮されたものらしいです。 ○Base16 0〜Fの16種類で、そのまま16進表記したものです。 バイナリエディタで表示されたものをそのまま並べたイメージですね。 ○ish パソコン通信時代にLHAとセットでバイナリデータの受け渡しに活躍した形式です。 non-kana、Shift-JIS、7ビットJIS、8ビットJISなどの複数の変換テーブルを持ちます。 この形式(ツール)はファイル名、サイズ、CRC、OS名等々の数多くの情報も格納し、 ヘッダ部分は通信エラーによる破損に備えて3回記述するなどの対策をしています。 そのため、まだ不具合の多かった通信環境の当時、強力なエラー訂正能力を誇っていたそうです。 拡張子は.ishになります。 実際にエンコードしたものを何種類かサンプルで挙げておきます。 尚、拡張子は一律.txtに変更してありますのでご了承下さい。 オリジナルの内容は、当サイトのURLを記述した30バイトのテキストです。
データに於いてコメントは、人間が識別しやすいように付けるメモと言えます。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||