趣味でC++をやっています。
[概要] 複数のファイルをZIPファイルに固めて、そのZIPファイルを「ファイルとして解凍せずに」メモリ展開をしたいのですが、 どのようにやればいいのでしょうか。
たとえば { "binary1.bin", "binary2.bin", "binary3.bin" }
を "archive1.zip" として固めて置きます。
そして、このarchive1.zipを 直接読み込んで binary1.bin 等をそれぞれ取り出したいのです。
(ただしメモリ上に展開すること)
参考1: Zipファイルを紙とペンで解凍してみた
参考2: ZIPの仕様を日本語でまとめる
を参考に、zipファイルの構成を調べて、自分なりにデータ列を取り出してみました。
未完成で、あっているかどうかはわかりませんが、一応、上記でいうファイルエントリなるものを取り出すことに成功しました。
※ 字数制限の為、別のサイトをお借りしています。
そこで、今回は、**「取り出したファイルエントリのデータを、どうやって元に戻すのか」**が知りたいのです。
参考1の「ZIPセントラルディレクトリファイルヘッダ」の項目で、
圧縮メソッド
ファイルエントリがどのプロトコルで格納されたかが書いてあります。
今回は無圧縮なので0が入っていますが8のDeflateが一般的です。
とあります。それで(以前、別のzipファイルで試したとき)試してみると、8になっていました。
そのため、「Deflate」状態になっているのだと思いますが、
これをもとの状態(圧縮前の状態)にするにはどのようにやればいいのでしょうか。
[情報]
言語: C++
コンパイラ: MinGW (g++)
[追記1]
一応、SaitoAtsushiさんのおっしゃるように、zlibなるものをDLして実際に使ってみました。
一旦、今回の私のコードとは別の実行ファイルとしてzlibを使ったプログラムを生成しておき、
何らかの画像ファイルとそれをzipファイルにした圧縮ファイルのそれぞれを用意します。
[準備0] ■ zlibを使った解凍系プログラム (便宜上、zlibmain.exe とする) ■ 今回の自分のプログラム (main.exe とする) ■ 適当な画像ファイル (image1.jpgとする) ■ image1.jpgをzipファイルにしたもの (arc1.zipとする)
※ zlibmain.exe のコードは zlib 入門 にある comptest2.c をそのまま流用。
[やったこと1] 1. main.exeでarc1.zipからimage1.jpgをファイルとして取り出す → そのファイルをcomp2.bin として生成しておく 2. zlibmain.exe で image1.jpg を comp.bin として圧縮する( "c" オプションにて ) 2. comp.bin と comp2.bin を それぞれ、BzEditor なるバイナリエディタでダンプリストを生成 3. (3)で生成されたダンプリストを二つ、比較してみる
この"やったこと1" では、そもそもデータが合っていないようです。
私が使った comp.bin では { ED, 02, 00, 00, 78, ... } となっていますが、
comp2.bin では { 01, FF, E0, F3, ... } のようになっています。
逆さなのかなぁと思い、(comp2.binを)逆から読んでみても、該当するデータ列が見つかりません。
単純に、ランダムに comp.bin にある { 00, 00 } をcomp2.bin から探し出して、
その周辺の16進数を比較しても同じデータになっていませんでした。
つまり、本来は同じファイルのデータを読んでいるはずなのに、別のデータ列になっているのです。
私の組み方が悪いのでしょうか。
あまりバイナリファイルを扱わないため、混乱しています…。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/20 10:12
2020/11/21 05:59
2020/11/25 01:56
2020/11/25 05:34
2020/11/25 05:43
2020/11/25 05:44 編集
2020/11/25 05:47 編集
2020/11/25 06:25
2020/11/25 13:08
2020/12/04 08:22
2020/12/05 06:30
2020/12/15 07:34