日記移転先(゜▽゜)

という名前の適当な日記ブログ


| Home | Index | Links | About |

Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

RARヘッダのファイル名


RARのヘッダって解りにくい。
まず細かい資料が無いもんな(;´Д`)
WinRAR同梱のTechNote.txtって全然細かく書いてない。
unrarのソース見ろが資料なんだろーか…?

まずヘッダ覗いて気になるのがファイル名(FILE_NAME)。
今のWinRARだとANSIでファイル名が入った後に\0区切りでUnicode名も入っている(半角のみ時は無し)。
そこまではフラグ説明部分(HEAD_FLAGS)からでも解るがencoded Unicode nameの詳細は無い。
UTF-8で収納も可能のようだがWinRARのデフォなのか手持ちの日本語名ファイルを圧縮したりRAR大好きな
国の人らが圧縮したRARファイルのヘッダ上は大抵ANSI+Unicodeで収納されてると思う。

結局私ゃ7zip様ソースからこの部分の圧縮を調べてみる事に。
んで見つけました。場所は 7zip/CPP/7zip/Archive/Rar/RarIn.cpp の DecodeUnicodeFileName() 辺り。
ファイル名部分の圧縮は圧縮アルゴリズム云々じゃなく簡単なフラグ操作で
収納されてるだけでした\(^o^)/

大雑把に言えば
 ・先頭の1バイトはUCS-2展開の上位バイト用のバッファ。(というか固定?)
 ・その後はデコード用の2bitフラグを4つ詰めた1byteと展開用の4文字が交互に収納。
が基本形になってる。(後述のフラグ=11が入ると↑通りではない。)

例としてファイル名が"日本語file.txt"で見てみます。
65E5 672C 8A9E 0066 0069 006C 0065 002E 0074 0078 0074
↑先に挙げますがUCS-2にデコードしたら上のようになります。
↓がRARヘッダ収納時のUnicode名部分。
... 65 68 E5 2C 67 9E 8A 66 00 69 6C 65 2E 00 74 78 74 ...
※先頭のオレンジ色がデコード時に使う1文字のバッファ、緑の文字はフラグ。
01.10.10.00  00.00.00.00  00.00.00.00
※↑補足用にフラグ部分だけ2bit区切りで挙げます。例に使ったファイル名じゃ単純すぎたかも(゜゜
 実際のフラグは展開しながら必要時読み込むのでフラグだけ先読みは不能。

フラグは上位から2bitずつ使用、以下の4種類の処理に分かれる。
00 : 次の1バイトを下位、上位は0x00。
01 : 次の1バイトを下位、上位はバッファの1バイト。
10 : 次の1バイトを下位、上位は次の次の1バイト。
11 : 次の1バイトをパラメータ用に読む。最上位ビットが1か0で処理が分かれる。残りはカウンタに使用。
  最上位ビットが1なら補正値として更に1バイト読む。
  ・カウンタ数+1文字分ANSIファイル名からコピーしていく。
  ・パラメータのフラグが1なら下位には補正値を加えて上位は0x00でなくバッファ値を使う。

フラグ11の説明は適当に省略したので7zipのソースとは違います(←処理分けてる)
ANSI部の読み位置はUCS-2の読みと同じ位置 (byte[n]→word[n]) であり先頭部分しか使い所がない(?)。

フラグからは文字列の終端は判らないのでデコード終了はUnicode名領域の長さ等から判断。



実際にWinRARで圧縮してみるとフラグ01でバッファの使用効率を上げる使い方はされないようです。
(少ししか検証してないですが…)
記事の頭に上げたサムネイルはなんかは同じ文字を2文字以上に連続して使ってみたりしたんですが
バッファには多用されている文字ではなく単純に最初に来るU+0100以上の文字の上位が収納されました。
上で適当に書いてるフラグ11は"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaあ.txt"のようなファイルを作って
rarにすれば使用されます。補正値を含むタイプは未検証。

RARのヘッダでこの辺り面白い仕様だなと思ったもんで取り上げてみました。
後でunrarのソース見たら書いてるのはencname.cpp辺り、7zipのソースとほぼ同じ(C++→C程度)。
あれ、このファイル名…大分昔に見てたわ(゜д゜;
呼んでるのはarcread.cppのArchive::ReadHeader()辺り、ヘッダの他の部分はこの辺りから読めばいいかも?



新規
←管理者にだけ表示する場合チェック



トラックバック用URL:
http://r2089.blog36.fc2.com/tb.php/134-a4296297

Appendix

profile

那駕〇

Author:那駕〇

recent entries

アクセスの多い記事

過去の記事


義援金募集

FC2「東北地方太平洋沖地震」義援金募集につきまして

ブロとも申請フォーム

この人とブロともになる

カウンタ

※ここより下の部分に掲示板とかまとめとかいうリンクがあってもそれはfc2blogの広告なので当blog内コンテンツではないです(゜д゜)
まとめ
....
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。