堕天使の煉獄
2016-09
03
23:48:24
やはりC言語は邪悪だ……
相も変わらずPG。そろそろお絵かきもやらないとな。
今日は、やはり欲しい。zip内ファイルの個別解凍機能。
ってことで一度は挫折したこの件を再調査してみたり。
とりあえず、基本的にはzip書庫の圧縮にはデフレート圧縮が使われている。それは良いんだけども、なんかいろいろこれも種類があるらしく。
書庫ファイル内からバイナリで圧縮ファイルのデータをもってきて、それを解凍するだけなのだけど、これが良い手段が見つからない。
まず、解凍をどうやるのかさっぱり。辞書+ハフマン方式だとか、こんなん1から自前で解凍出来るようなものを作るのは骨が折れそうで。
しかし、メジャーどころのライブラリなんかでは、書庫ファイル自体を読み込んで、独自のハンドル操作やら、ファイルを検索する機構とセットで解凍機能がついてるんですよね。
そんでもって、出力は大抵ファイル。
メモリ上の圧縮データをメモリバッファに解凍。というのが欲しいのだけども。
なので、解凍ルーチンだけが欲しいんだけどなぁ。
で、いろいろ探していると、1ファイルで完結してるという、「miniz.c」なる物を発見。
uncompress( buffer, &buffer_size, src_memory, src_size );
おお、こういうのが欲しかったっ。
やっと見つけたーと、試してみると、解凍に失敗のエラーが。
デバッガで追ってみると、なんかソースと出力先のバッファサイズ回りでなんかエラーが起きてるっぽい。
んー。圧縮ファイルと解凍後のファイルのサイズなんか間違いようもないし……。
なんど見返してもうまく動かん~。
したらこんな記事が。
データ圧縮 zlib と gzip と zip (zlib で zip にアクセスする)
ttp://wlog.flatlib.jp/item/1653
どうも、miniz.cのuncompressは、zlib形式の解凍に使うものらしい。
で、zlibと、zip書庫内ファイルの違いといえば……圧縮形式は同じ? なのだけどもzlibには独自のヘッダが付加されているんだそうな。
書庫内zipファイルは、圧縮ファイルのサイズだとか圧縮方式だとかは、zipファイルのファイルヘッダとして別個にもっていて、圧縮ファイルはヘッダ無しのベタファイルになるようです。
そんで、uncompressの内部で行われているinflateInitをinflateInit2に変えて、 windowBitsに「-MZ_DEFAULT_WINDOW_BITS」を与えてやると、ヘッダ無しの生データ(raw)として解凍されるとのこと。
で、その辺修正した自前のuncompress関数にぶっ込んでみると。
解凍出来たー!
最初のはzlibのヘッダ分でバッファのサイズが狂ってたのね……。
てかzlibとかgzipとかややこしぃ……。
そんな感じで、圧縮書庫内ファイルの画像もプレビュー出来るように。
んー意外に展開速いな。画像一枚単位だからだろうか。ファイルアクセスの速度のがよっぽど問題なのか、あんまし展開速度に非圧縮と差が感じられない。
とはいえさすがに画像のヘッダ情報も読み込むのは、全ファイル解凍と同じで数個のファイルでのテストとは違って、実際の運用では重たくなりそうなので、やっぱ圧縮ファイルはファイル選択時のみ個別解凍でプレビュー表示のみ……というのが妥当か。
あとはこのバージョンでは、unzip32も7-Zipなどの統合アーカイバ系は使わない形に。結局全部バイナリから自前で読んだ方が速いし融通きくなと。windows.hもインクルードしなくて済むし。ああすっきり。
そんでもって、編集設定画面を別画面に移したので、画像プレビューも大きくなったり。やっぱ画像プレビュー画面は大きい方がいいな。
しかし……「miniz.c」……これ拡張子がcになってる通り、C言語ベースなんですよね。しかもソースファイルだし。なんでhじゃないんだ……。
そんでもって中身はdefineもりもり、マクロもりもり。目からゲボがでそう……。
あと、一応zip書庫内の解凍にも対応してるようなのですが、こちらは統合アーカイバ系とちがい、何番目のファイルか指定して解凍する形ぽ。
なので、一旦リスト化して、あとはインデックスで解凍するファイルを選択する形っぽい。
ファイル名で毎度検索するっぽい統合アーカイバ系よりはマシな作りの気もするのだけど、最初からファイル名判ってて解凍したいときは結局走査がいるので、使い勝手はあまり良くないぽですね。(すでに別手段でリストを取得後の状態で解凍なんてときに、結局再捜査がいるぽなので。インデックス番号がどういう順番のルールなのかもわからないし)
そんなこんなで220kbぐらいあったcソースコードから、圧縮もつかわなーいってことで、zipファイル関係と圧縮関係のコードをばっさり削って、さらにソースではなくヘッダファイルに変更。
んでも100kbぐらいある……。
そんでもって、できればクラスライブラリ化したかったのだけども、C言語ベースのポインタうんこもりのコードなので、とても触る気にもならず……。
単にラップするのでは意味ないし(defineマクロ系を排除が一番の目的なので)結局ヘッダ化したところで妥協。
そんでテスト用プロジェクトで動作確認後、本チャンのプロジェクトに組み込む。
#define crc32 mz_crc32
うぉいキミぃ。
こんな定義の所為で自前のcrc32関係のコードが誤爆を受ける……。
define定義による名前空間汚染事故は結局起るのか……せっかくwindows.h排除したのに……。
ていうか他にももりもり小文字オンリーのdefine定義があったりして、止めてぇ……ってかんじぽ。
やっぱC言語って邪悪だわ……。
今日は、やはり欲しい。zip内ファイルの個別解凍機能。
ってことで一度は挫折したこの件を再調査してみたり。
とりあえず、基本的にはzip書庫の圧縮にはデフレート圧縮が使われている。それは良いんだけども、なんかいろいろこれも種類があるらしく。
書庫ファイル内からバイナリで圧縮ファイルのデータをもってきて、それを解凍するだけなのだけど、これが良い手段が見つからない。
まず、解凍をどうやるのかさっぱり。辞書+ハフマン方式だとか、こんなん1から自前で解凍出来るようなものを作るのは骨が折れそうで。
しかし、メジャーどころのライブラリなんかでは、書庫ファイル自体を読み込んで、独自のハンドル操作やら、ファイルを検索する機構とセットで解凍機能がついてるんですよね。
そんでもって、出力は大抵ファイル。
メモリ上の圧縮データをメモリバッファに解凍。というのが欲しいのだけども。
なので、解凍ルーチンだけが欲しいんだけどなぁ。
で、いろいろ探していると、1ファイルで完結してるという、「miniz.c」なる物を発見。
uncompress( buffer, &buffer_size, src_memory, src_size );
おお、こういうのが欲しかったっ。
やっと見つけたーと、試してみると、解凍に失敗のエラーが。
デバッガで追ってみると、なんかソースと出力先のバッファサイズ回りでなんかエラーが起きてるっぽい。
んー。圧縮ファイルと解凍後のファイルのサイズなんか間違いようもないし……。
なんど見返してもうまく動かん~。
したらこんな記事が。
データ圧縮 zlib と gzip と zip (zlib で zip にアクセスする)
ttp://wlog.flatlib.jp/item/1653
どうも、miniz.cのuncompressは、zlib形式の解凍に使うものらしい。
で、zlibと、zip書庫内ファイルの違いといえば……圧縮形式は同じ? なのだけどもzlibには独自のヘッダが付加されているんだそうな。
書庫内zipファイルは、圧縮ファイルのサイズだとか圧縮方式だとかは、zipファイルのファイルヘッダとして別個にもっていて、圧縮ファイルはヘッダ無しのベタファイルになるようです。
そんで、uncompressの内部で行われているinflateInitをinflateInit2に変えて、 windowBitsに「-MZ_DEFAULT_WINDOW_BITS」を与えてやると、ヘッダ無しの生データ(raw)として解凍されるとのこと。
で、その辺修正した自前のuncompress関数にぶっ込んでみると。
解凍出来たー!
最初のはzlibのヘッダ分でバッファのサイズが狂ってたのね……。
てかzlibとかgzipとかややこしぃ……。
そんな感じで、圧縮書庫内ファイルの画像もプレビュー出来るように。
んー意外に展開速いな。画像一枚単位だからだろうか。ファイルアクセスの速度のがよっぽど問題なのか、あんまし展開速度に非圧縮と差が感じられない。
とはいえさすがに画像のヘッダ情報も読み込むのは、全ファイル解凍と同じで数個のファイルでのテストとは違って、実際の運用では重たくなりそうなので、やっぱ圧縮ファイルはファイル選択時のみ個別解凍でプレビュー表示のみ……というのが妥当か。
あとはこのバージョンでは、unzip32も7-Zipなどの統合アーカイバ系は使わない形に。結局全部バイナリから自前で読んだ方が速いし融通きくなと。windows.hもインクルードしなくて済むし。ああすっきり。
そんでもって、編集設定画面を別画面に移したので、画像プレビューも大きくなったり。やっぱ画像プレビュー画面は大きい方がいいな。
しかし……「miniz.c」……これ拡張子がcになってる通り、C言語ベースなんですよね。しかもソースファイルだし。なんでhじゃないんだ……。
そんでもって中身はdefineもりもり、マクロもりもり。目からゲボがでそう……。
あと、一応zip書庫内の解凍にも対応してるようなのですが、こちらは統合アーカイバ系とちがい、何番目のファイルか指定して解凍する形ぽ。
なので、一旦リスト化して、あとはインデックスで解凍するファイルを選択する形っぽい。
ファイル名で毎度検索するっぽい統合アーカイバ系よりはマシな作りの気もするのだけど、最初からファイル名判ってて解凍したいときは結局走査がいるので、使い勝手はあまり良くないぽですね。(すでに別手段でリストを取得後の状態で解凍なんてときに、結局再捜査がいるぽなので。インデックス番号がどういう順番のルールなのかもわからないし)
そんなこんなで220kbぐらいあったcソースコードから、圧縮もつかわなーいってことで、zipファイル関係と圧縮関係のコードをばっさり削って、さらにソースではなくヘッダファイルに変更。
んでも100kbぐらいある……。
そんでもって、できればクラスライブラリ化したかったのだけども、C言語ベースのポインタうんこもりのコードなので、とても触る気にもならず……。
単にラップするのでは意味ないし(defineマクロ系を排除が一番の目的なので)結局ヘッダ化したところで妥協。
そんでテスト用プロジェクトで動作確認後、本チャンのプロジェクトに組み込む。
#define crc32 mz_crc32
うぉいキミぃ。
こんな定義の所為で自前のcrc32関係のコードが誤爆を受ける……。
define定義による名前空間汚染事故は結局起るのか……せっかくwindows.h排除したのに……。
ていうか他にももりもり小文字オンリーのdefine定義があったりして、止めてぇ……ってかんじぽ。
やっぱC言語って邪悪だわ……。
Sun
Mon
Tue
Wed
Thu
Fri
Sat
01
02
■
■
コピペばかりは飽きる
03
■
■
やはりC言語は邪悪だ……
04
05
06
07
08
■
■
一度かたむくとなかなか
09
10
■
■
そういう時節なのか
11
■
■
大分夜は涼しくなってきた
12
13
■
■
あいかわらず糞だな
14
■
■
気力の問題
15
16
17
18
19
[敬老の日]
20
21
22
[秋分の日]
23
24
25
26
27
28
29
30
total:2081321 t:81 y:214
■記事タイトル■
■年度別リスト■
2024年
2024年12月(0)2024年11月(0)
2024年10月(1)
2024年09月(2)
2024年08月(1)
2024年07月(1)
2024年06月(5)
2024年05月(2)
2024年04月(1)
2024年03月(6)
2024年02月(4)
2024年01月(3)
2023年
2023年12月(3)2023年11月(1)
2023年10月(2)
2023年09月(3)
2023年08月(3)
2023年07月(3)
2023年06月(7)
2023年05月(8)
2023年04月(2)
2023年03月(1)
2023年02月(2)
2023年01月(3)
2022年
2022年12月(4)2022年11月(3)
2022年10月(1)
2022年09月(3)
2022年08月(3)
2022年07月(2)
2022年06月(1)
2022年05月(3)
2022年04月(2)
2022年03月(2)
2022年02月(1)
2022年01月(6)
2021年
2021年12月(8)2021年11月(3)
2021年10月(4)
2021年09月(6)
2021年08月(2)
2021年07月(1)
2021年06月(3)
2021年05月(2)
2021年04月(2)
2021年03月(3)
2021年02月(1)
2021年01月(4)
2020年
2020年12月(3)2020年11月(7)
2020年10月(2)
2020年09月(3)
2020年08月(1)
2020年07月(3)
2020年06月(7)
2020年05月(5)
2020年04月(8)
2020年03月(4)
2020年02月(2)
2020年01月(4)
2019年
2019年12月(1)2019年11月(1)
2019年10月(2)
2019年09月(1)
2019年08月(3)
2019年07月(2)
2019年06月(2)
2019年05月(2)
2019年04月(4)
2019年03月(1)
2019年02月(7)
2019年01月(1)
2018年
2018年12月(1)2018年11月(1)
2018年10月(5)
2018年09月(1)
2018年08月(5)
2018年07月(1)
2018年06月(1)
2018年05月(1)
2018年04月(2)
2018年03月(2)
2018年02月(1)
2018年01月(1)
2017年
2017年12月(2)2017年11月(1)
2017年10月(2)
2017年09月(5)
2017年08月(8)
2017年07月(2)
2017年06月(1)
2017年05月(1)
2017年04月(3)
2017年03月(5)
2017年02月(7)
2017年01月(8)
2016年
2016年12月(7)2016年11月(2)
2016年10月(3)
2016年09月(7)
2016年08月(8)
2016年07月(10)
2016年06月(17)
2016年05月(6)
2016年04月(8)
2016年03月(10)
2016年02月(5)
2016年01月(10)
2015年
2015年12月(7)2015年11月(7)
2015年10月(13)
2015年09月(7)
2015年08月(7)
2015年07月(5)
2015年06月(4)
2015年05月(5)
2015年04月(2)
2015年03月(4)
2015年02月(1)
2015年01月(7)
2014年
2014年12月(12)2014年11月(8)
2014年10月(4)
2014年09月(6)
2014年08月(7)
2014年07月(4)
2014年06月(2)
2014年05月(5)
2014年04月(4)
2014年03月(8)
2014年02月(4)
2014年01月(8)
2013年
2013年12月(15)2013年11月(8)
2013年10月(3)
2013年09月(3)
2013年08月(8)
2013年07月(0)
2013年06月(0)
2013年05月(0)
2013年04月(0)
2013年03月(0)
2013年02月(0)
2013年01月(0)
■レス履歴■
■ファイル抽出■
■ワード検索■
堕天使の煉獄
https://rengoku.sakura.ne.jp
管理人
織田霧さくら(oda-x)
E-mail (■を@に)
oda-x■rengoku.sakura.ne.jp