ZIPの解凍あたりのプログラムを作ってみた系 GZIPファイルやZIPファイルを自分で作ろう

Slides:



Advertisements
Similar presentations
Copyright © the University of Tokyo 文字化けの背景を知る. Copyright © the University of Tokyo 課題の概要 日本語の文字コードについて理解を深める  MacOS( テキストエディット ) で利用可能なエ ンコーディング ( コード化方式.
Advertisements

Copyright © the University of Tokyo 文字化けの背景を知る. Copyright © the University of Tokyo 課題の概要 日本語の文字コードについて理解を深める  MacOS( テキストエディット ) で利用可能なエ ンコーディング ( コード化方式.
Flash SWF ファイル書き換え PHP extension 2008 年 7 月 21 日 よや.
GZIPファイルやZIPファイルを自分で作ろう
Ddによる複製 2004/05/24 伊原 秀明(Port139).
画像ファイルの形式とデータサイズ.
プログラムNo.:論文タイトル(必ず書いてください)
PHP AV(Audio Visual) 拡張 クライアントサイド PHP アプリケーションPHP
Step.5 パケットダンプ Wiresharkでパケットをキャプチャする PC 1 PC 2 PC 3 PC 4 ネットワーク
計算機工学III オペレーティングシステム #14 ファイル: より進んだファイルシステム 2006/07/21 津邑 公暁
PHP AV(Audio Visual) 拡張 PHP asアプリケーション
富山大学 公開講座 2008 「QRコードを作ろう!」 ~ QRコードを作ろう! ~.
文字列検出ツール "istrings" の使い方
正規表現ライブラリ 一般的なもの GNU regex GNU rx pcre Henry Spencer’s regex.
Unix生活 Vol.1
.NET テクノロジー を利用した SAP ソリューションの拡張 (3階層化) (評価環境構築ガイド)
3DCGコンテンツの基礎 第5回授業:最終課題制作
ZIPの解凍あたりのプログラムを作ってみた系 GZIPファイルやZIPファイルを自分で作ろう
Linux リテラシ 2006 第2回 基本コマンド2.
情報理工学部 情報システム工学科 ラシキアゼミ3年 H 岡田 貴大
地理情報システム論 第3回 コンピュータシステムおける データ表現(1)
削除されたファイルの復元 2004/05/26 伊原 秀明(Port139).
NTFS 2004/05/24 伊原 秀明(Port139).
第2章 ソフトウェアの基礎知識 電子制御設計製図Ⅰ    2010年5月11日 Ⅲ限目.
第2章 ソフトウェアの基礎知識.
心理学情報処理法Ⅰ コンピュータにおけるデータ表現 マルチメディアとコンピュータ.
文字化けの背景を知る.
プログラミング言語論 プログラミング言語論 プログラミング言語論 演習1 解答と解説 演習1解答と解説 1 1.
MSBuild 色々出来るよ 2011/04/02 お だ.
SWAT I18N 概要 付け足した機能(実行時に言語の切り替え-i18nの範囲で) 問題点(細かい技術的問題、根本的問題) 今後
2012年度 情報数理 ~ QRコードを作ろう!(1) ~.
2008年度 情報数理 ~ QRコードを作ろう!(1) ~.
HTTPプロトコルとJSP (1) データベース論 第3回.
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
Telnet, rlogin などの仮想端末 ftp などのファイル転送 rpc, nfs
UNIXについて 松野秀平.
.NET テクノロジー を利用した SAP ソリューションの拡張 (3階層化) (評価環境構築ガイド)
2010年度 情報数理 ~ QRコードを作ろう!(1) ~.
Titanium Studioを使った アプリ開発 Vol.1
データベース設計 第2回 データベースモデル(1)
Microsoft PowerPoint98 Netscape Communicator 4.06[ja]
Office IME 2010 を使う.
Windows Azure (CTP) 触ってみた
Javaソースコード蓄積・ 検索システムSPARS-Jの概要
第10回 ファイル管理 論理レコードと物理レコード アクセス方式 ユーザから見たファイルシステム 補助記憶装置の構成
わんくま同盟・techbank.jp 夏椰 Insight Technology, Inc. 今川 美保
Windows PowerShell Cmdlet
独習XML 第2章 XML文書の構成要素 2.1 XMLの文字と文字列 2.2 コメント
Microsoft Visual Studio 2005 Tools for
画像処理プログラムの説明.
2章 暗号技術 FM15002 友池 絲子.
第4回 コンピューティングの要素と構成 平成22年5月10日(月)
デジタル画像とC言語.
・タイプ別のフレームワーク ・デジタルTips(小技テクニック情報)
文字エンコーディング 2010年7月.
第2章 ソフトウェアの基礎知識 電子制御設計製図Ⅰ    2010年5月19日 Ⅱ限目.
Windows Azure (CTP) 触ってみた
アルゴリズムとデータ構造1 2005年7月5日
WindowsMobile de HelloWorld
WindowsMobile de HelloWorld
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
アルゴリズムとデータ構造1 2006年6月23日
日本語独特のL10N問題とは? 各社仕様の拡張文字 複数の符号化 規格の混乱など Unicodeとのマッピング
「拝啓、さかもとと申します」 2008年6月28日 わんくま同盟 勉強会初参戦。 ※最重要 -質問はご遠慮願います-
アルゴリズムとデータ構造1 2009年6月15日
「拝啓、さかもとと申します」 2008年6月28日 わんくま同盟 勉強会初参戦。 ※最重要 -質問はご遠慮願います-
アルゴリズムとデータ構造 2010年6月17日
/etc/passwd, /etc/group, /etc/hosts ファイルの意味
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
7-Zipのインストール (Windows 10)
Presentation transcript:

ZIPの解凍あたりのプログラムを作ってみた系 GZIPファイルやZIPファイルを自分で作ろう ぽぴ王子@わんくま同盟

アジェンダ 自己紹介 きっかけ tar形式のフォーマット解説 ZIP形式のフォーマット解説 実際に圧縮ファイルを作ってみるデモ まとめ

オンラインでは威勢はいいが、オフラインでは意外とシャイです パソコン歴は25年ほど SEとしてのPC歴は20年ぐらい ぽぴ王子とはこんな人 王冠の人 仕事は王子兼システムエンジニア オンラインでは威勢はいいが、オフラインでは意外とシャイです パソコン歴は25年ほど SEとしてのPC歴は20年ぐらい Microsoft MVPを再受賞しました

という二種類の圧縮/伸張に関するクラスが追加されている セッションのきっかけ .NET Framework 2.0から GZipStream DeflateStream という二種類の圧縮/伸張に関するクラスが追加されている ん?DeflateってZIPで使われてる圧縮形式じゃなかった?

ということは、これでZIP書庫を作ったり解凍したりできるんじゃね? ……と思っていた時期が僕にもありました。 セッションのきっかけ Wikipediaにはこう書いてある ということは、これでZIP書庫を作ったり解凍したりできるんじゃね? ……と思っていた時期が僕にもありました。 Deflate(デフレート)はPhil Katzが開発した圧縮ツールPKZIPのバージョン2で使われているデータ圧縮アルゴリズム。ZIPやgzipなどで使われている。

実際はDeflateStreamはZIPの圧縮部分のストリームなので、圧縮してもZIP書庫にはなりません! セッションのきっかけ MSDNを見ると とか書いてあるの。 実際はDeflateStreamはZIPの圧縮部分のストリームなので、圧縮してもZIP書庫にはなりません! このクラスは本来、.zip アーカイブとの間でファイルの追加や抽出を行うための機能を提供するものではありません。

でもDeflateStreamがZIPの圧縮部分と同じモノなのだとすれば、それで足りないヘッダとか付ければZIP書庫になるんじゃないかしら? セッションのきっかけ でもDeflateStreamがZIPの圧縮部分と同じモノなのだとすれば、それで足りないヘッダとか付ければZIP書庫になるんじゃないかしら? というのがきっかけです。 …長いよ。

PKZIPのバージョン2以降で使われているデータ圧縮アルゴリズム PKWAREのPhil Katz(フィル カッツ)氏が開発 Deflateとは PKZIPのバージョン2以降で使われているデータ圧縮アルゴリズム PKWAREのPhil Katz(フィル カッツ)氏が開発 圧縮は比較的高速、伸長は非常に高速 ZIPやgzipなどで使われている パテントフリー 保証されているわけではないが、特許にかかわるアルゴリズムは一切使用されていないと考えられている

tarはTape ARchive formatの略 その名の通りテープに保存するために複数のファイルを連結したもの (Tape Archive and Retrieval formatとも) その名の通りテープに保存するために複数のファイルを連結したもの tarで連結したあと、GNU zipを使用して圧縮を行う tarで連結したものは拡張子 .tar になり、それを gzip圧縮したものは .tar.gz となる

tar形式のファイル構造 tar形式について header(ヘッダ部分)512bytes ヘッダは必ず512バイト data(データ部分)512bytesの倍数 512バイトの倍数で構成される。余った部分は00で埋められる header(ヘッダ部分)512bytes data(データ部分)512bytesの倍数 end of mark 1024bytes 終端は1024バイトの00埋め

tar形式のヘッダは以下のようになっています フィールド名 バイト数 ファイル名 100 属性 8 ユーザーID グループID ファイルサイズ 12 更新日時 チェックサム タイプ 1 リンク先ファイル名 マジックコード/バージョン番号 ユーザ名 32 グループ名 メジャーデバイス番号 マイナーデバイス番号 予約領域 167

基本はASCIIの文字列(!!)数値は8進数の文字列として格納される パラメータの解説 基本はASCIIの文字列(!!)数値は8進数の文字列として格納される ファイル名 ASCIIまたはSJISで100バイト(パス名含む) ユーザID/グループID “0”はルートをあらわす 更新日時 ustat()で得られる最終更新日時の値を8進数文字列であらわしたもの(詳細は割愛)

メジャーデバイス番号/マイナーデバイス番号 パラメータの解説 チェックサム ヘッダ512バイト分のチェックサム チェックサム自身はスペース8文字として計算する マジックコード/バージョン番号 “ustar\0” + バージョン番号 “00” ユーザ名/グループ名 null終端のASCII文字列 メジャーデバイス番号/マイナーデバイス番号 タイプが[3]または[4]の場合のみ使用

属性(16ビット分が8進数の文字列として登録される) パラメータの解説 属性(16ビット分が8進数の文字列として登録される) ビット 説明 他人の実行属性 1 他人の書き込み属性 2 他人の読み込み属性 3,4,5 グループの属性 6,7,8 オーナーの属性 9 sticky bit(詳細不明) 10 set GID 11 set UID 12 パイプ 13 キャラクタ型スペシャルファイル 14 ディレクトリ 15 通常のファイル

タイプ パラメータの解説 文字 説明 通常のファイル 1 リンク(詳細不明) 2 シンボリックリンク(詳細不明) 3 通常のファイル 1 リンク(詳細不明) 2 シンボリックリンク(詳細不明) 3 キャラクタ型デバイス(詳細不明) 4 ブロック型デバイス(詳細不明) 5 ディレクトリ 6 FIFOスペシャルファイル(詳細不明) 7 リザーブ? A-Z 将来のために予約

日本ではあまりなじみがないが、欧米では割とメジャーな圧縮形式 ZIPファイルについて 日本ではあまりなじみがないが、欧米では割とメジャーな圧縮形式 Implobe/Deflate/Deflate64/Bzip2 などの圧縮形式を使用可能(一般的に Deflate が使用される) 暗号化にも対応 Javaは標準ライブラリで使用可能

全体の作りはこんな感じ ZIPファイルの構造 local file header(ヘッダ部分) 三種類のデータで1セットになっていて、ファイル数ぶん繰り返される file data(圧縮されたデータ) data descriptor archive decryption header archive extra data record 暗号化データ(詳細不明) local file headerとほぼ同じものの集合が格納されている central directory zip64 end of central directory record zip64 end of central directory locator ZIP64用(詳細不明) central directoryの終端をあらわす end of central directory record

ヘッダ情報はこんな感じになってます local file header 説明(日本語) 説明(英語) バイト数 シグネチャ local file header signature (0x04034b50) 4 解凍に必要なバージョン version needed to extract 2 設定ビット general purpose bit flag 圧縮形式 compression method 最終変更時刻 last mod file time 最終変更日付 last mod file date CRC32 crc-32 圧縮後のサイズ compressed size 圧縮前のサイズ uncompressed size ファイル名サイズ file name length 拡張領域のサイズ extra field length ファイル名(可変) file name (variable size) 拡張領域(可変) extra field (variable size)

解凍に必要なバージョン~拡張領域のサイズはlocal file headerと同じ central directory local file headerとほぼ同様です 説明(日本語) 説明(英語) バイト数 シグネチャ central file header signature (0x02014b50) 4 作成されたバージョン version made by 2 解凍に必要なバージョン~拡張領域のサイズはlocal file headerと同じ コメントのサイズ file comment length 開始ディスク番号 disk number start 内部ファイル属性 internal file attributes 外部ファイル属性 external file attributes ローカルヘッダの位置 relative offset of local header ファイル名(可変) file name (variable size) 拡張領域(可変) extra field (variable size) ファイルコメント(可変) file comment (variable size)

end of central directory record 説明(日本語) 説明(英語) バイト数 シグネチャ end of central dir signature (0x06054b50) 4 ディスク番号 number of this disk 2 詳細不明 number of the disk with the start of the central directory ディスク内のセントラルディレクトリのエントリ数 total number of entries in the central directory on this disk セントラルディレクトリ内のエントリ数 total number of entries in the central directory セントラルディレクトリのサイズ size of the central directory offset of start of central directory with respect to the starting disk number ZIPファイルのコメントサイズ .ZIP file comment length ZIPファイルのコメント(可変) .ZIP file comment (variable size)

作成されたバージョン パラメータの解説 上位バイトは以下の環境をあらわす 下位バイトは作成されたZIPフォーマットのバージョンをあらわす(2.0ならば10進数で20[0x14]) 値 説明 MS-DOS and OS/2 11 MVS (OS/390 - Z/OS) 1 Amiga 12 VSE 2 OpenVMS 13 Acorn Risc 3 UNIX 14 VFAT 4 VM/CMS 15 alternate MVS 5 Atari ST 16 BeOS 6 OS/2 H.P.F.S. 17 Tandem 7 Macintosh 18 OS/400 8 Z-System 19 OS/X (Darwin) 9 CP/M 20-255 未使用 10 Windows NTFS

解凍に必要なバージョン パラメータの解説 基本的には2.0を指定しておけば大丈夫です。 値 説明 1.0 デフォルト値 1.1 ボリュームラベル 2.0 フォルダ(ディレクトリ) Deflateアルゴリズム PKWARE製の伝統的な暗号化方式 2.1 Deflate64アルゴリズム 2.7 パッチデータ(詳細不明) 4.5 ZIP64フォーマット 4.6 Bzip2アルゴリズム 5.0 DES/3DES/オリジナルRC2暗号/RC4暗号 5.1 AES/正式な(corrected)RC2暗号 5.2 正式な(corrected)RC2-64暗号 6.2 central directoryが暗号化されている? 6.3 LZMA/PPMd+/Blowfish/Twofish

設定ビット パラメータの解説 ビット 説明 Bit 0 暗号化されていることを示す Bit 1-2 以下の組み合わせによる Bit 3 1だった場合はCRC32フィールドとサイズフィールドが0になり、正しい値はdata descriptorで設定される Bit 4 予約 Bit 5 パッチデータ(詳細不明)であることをあらわす Bit 0 Bit 1 意味 通常圧縮 1 最大圧縮 速度優先 最大速度優先

設定ビットの続き パラメータの解説 ビット 説明 Bit 6 AES暗号化されていることを示す 未使用 Bit 11 Language encoding flag (EFS) Early Feature Specification このビットがセットされている場合はファイル名がUTF-8でエンコーディングされている Bit 12 PKWAREによって予約 Bit 13 central directoryが暗号化されていることを示す(?) 詳細はStrong Encryption Specificationを参照のこと (よくわかっていません) Bit 14-15

compression method パラメータの解説 代表的なもののみ示す 値 説明 圧縮なし 8 Deflate圧縮 9 圧縮なし 8 Deflate圧縮 9 拡張Deflate圧縮 Deflate64 12 BZip2圧縮

日付 時刻 パラメータの解説 Bit 説明 0-4 日付 5-8 月 9-15 1980年からの経過年 Bit 説明 0-4 秒の1/2の値 5-10 分 11-15 時

そのほかのパラメータについて パラメータの解説 CRC32 圧縮後のサイズ 圧縮前のサイズ ファイル名 未圧縮のデータのCRC32を示します 文字コードとして基本的にASCII または日本語の場合はシフトJISを使用 ただしMacintoshで作成された書庫などでUTF8が使われる場合もあり

tar.gzファイルを作る ZIPファイルを作る ⇒自作プログラムを使用したデモ tar形式を作ってからGZipStreamで圧縮する 実際にファイルを作ってみる tar.gzファイルを作る tar形式を作ってからGZipStreamで圧縮する ZIPファイルを作る ヘッダ部分を設定したものと、DeflateStreamを使用した圧縮データを合成する ⇒自作プログラムを使用したデモ

GZipStreamまたはDeflateStreamを使用し てtar.gzファイルやZIPファイルを作成す ることは可能! まとめ GZipStreamまたはDeflateStreamを使用し てtar.gzファイルやZIPファイルを作成す ることは可能! ただし圧縮率を指定することはできない どちらかと言えば圧縮よりも解凍に特化 した方がいいかもしれない

APPNOTE.TXT - .ZIP File Format Specification 参考資料 tarの構造 http://www.redout.net/data/tar.html TAR32.DLL フォーマット説明ファイル http://openlab.ring.gr.jp/tsuneo/soft/tar32_2/tar32_2/sdk/TAR_F MT.TXT APPNOTE.TXT - .ZIP File Format Specification http://www.pkware.com/documents/casestudies/APPNOTE.TXT