堕天使の煉獄

Gallery
Comic
Story
Production
Work
Link

2016-08

23

03:06:01

ずるずる

まだ書庫内ファイル変換PGやってたり。
なんかいろいろと横道にそれたりしてるもんだから……。

結局、jpgのExif情報は、なんだかんだで要らないデータだという結論に。
そも、QImageで読み込んで、変換とかした上で再保存すると、Exif情報は吹っ飛ぶのがデフォなので。そして、もともとExif情報は除去したい方向なのと、jpg限定なので、わざわざ読み込んでも利用価値とかないなと。読み書きでExif情報を保持しつづけたいというのでもなければ、もともと必要もないものだし。
でも、非圧縮な書庫の場合は、ファイルデータがそのまま入ってるので、ヘッダを読む事は可能ということで、画像のサイズ(width,height)と色数、ビット深度ぐらいは取得するかーということで、jpegのその情報とるのにも、結局たくさんあるヘッダ情報のなかから取捨選択するのに、結局それなりにヘッダの構造の知識はいったので、まあ結果オーライか。てか、ひちめんどくさいフォーマットになってるのですね……jpgって。

それに引き替え、bmpやpngのフォーマットの簡素なこと。わかりやすくて良いです。
てか、bmpのヘッダなんか久しぶりにのぞいたよ……大昔の、HTでαブレンディングとかやってた時代を思い出すにょう。
昔は自前でピクセル見て透過処理とかやてったんですよね。なのでピクセルデータがベタで入ってるbmpファイルが使われたので。

なにげに微妙に嵌ったのが、bmpやpngのヘッダのなかの画像の大きさのデータはwidth、heightの順番に格納されているのだけども、なぜかjpgはheight,widthの順番に格納されてるぽ。なので、情報取得してリストで表示してる時に、あれ? 幅のサイズがおかしい?? と一瞬混乱したw うーん。jpgめんどくせぇ。

んで、ようやく最後の仕上げ、変換後の書庫ファイル書き出し部分。

とりあえずテストでQImageで読み込んだ画像をメモリ上のバッファに保存。そのバッファをつかって、その画像一枚だけ入ってる非圧縮zipファイルをバイナリから作ってみるテストを別プロジェクト立ち上げて作ってみることに。

……そうか、zipに登録するファイルって、crc32の値がいるのか。

いまだにc++って、標準でcrc32を算出するのないんだよな。他の言語ではぼちぼちはいってるのに。

が、QTなら、とおもったんだけども、QTにもはいってなひ……。

結局自前で(つーてもほとんどwebサイトで見つかったコードをQT用に書き直しただけ)実装。

で、zip出力。

「CRCエラー」

あるぇー? _| ̄|○

Explzhで中身を見てみると、追加した画像ファイルは認識してるっぽい。
ファイルのcrc32の値も、にバイナリ化したQImageのデータを一旦またjpgにして保存したファイルを、普通の圧縮ソフトでzip化したものの中のファイルのcrc32の値と同値。

crc32の算出が間違っているわけでもないぽ。でもなんで「CRCエラー」??

書庫内ファイルも開けないし。

Explzhの「修復」を行ってみる。
したら普通に利用可能な書庫になる。

んで、バイナリエディタで、修復前と後を比較してみると……。

んん?
なんでか修復後のファイル、CentralDirectoryHeader部の対応するLocalFileHeaderまでのオフセットが変な値になってる。
ここは、ファイルは一つしかないのでファイルの先頭、0になってるはずなんだけど。

でも書庫ファイルは開けてるので、問題はここじゃない。

うーん。

結果的には、書庫の一番末尾につけるEndOfCentralDirectoryRecord内の1フィールドのサイズが一個、2バイトのところを4バイトにしちゃってたところがあったというオチで、そこ直したら普通にzipとして認識されたりしてw EndOfCentralDirectoryRecordのサイズがおかしかったのですね。普通に書庫内の画像も閲覧出来る用に。

でもそれでなんでCRC32エラー?
あと、修復後のファイルのほうの、LocalFileHeaderまでのオフセットが異常値でもzipファイルとしては問題無いってのも不思議。

てかこの値、普通に使ってないんだろうな……。

ファイルの構造的に、先頭からLocalFileHeader読んでったとき、のときにLocalFileHeaderの開始位置オフセットも取得しながら読んでいくのだけど、それはCentralDirectoryHeaderにLocalFileHeaderのオフセットを書き込むフィールドがあるからと言う理由で。順序が逆だw

なので、このオフセット値ってそもつかわないんだよな。
本来はファイル末尾のEndOfCentralDirectoryRecordから読みこんで、その中の
CentralDirectoryHeaderの開始位置オフセット読み込んで、そこからCentralDirectoryHeader内のLocalFileHeaderの情報を読んでいくという構想だったのだろうけど……。

EndOfCentralDirectoryRecordの末尾に可変長のデータがあることと、いろいろほかにも拡張データとか引っ付いてたりするので、末尾からEndOfCentralDirectoryRecordの先頭を探すのは確実性が低い(拡張データとかのなかに、偶然ヘッダの開始シグネイチャと同じ並びのバイナリがないともかぎらないので)

結局この方法の読み込みは現実的ではなく、結局先頭から読んでいく形になると、LocalFileHeaderのオフセットいらないんですよね。
そんなかんじなので、CentralDirectoryHeaderも、LocalFileHeaderと重複してるデータ部を比較して正当性チェックのためにあるようなもので、本来の収録ファイルのインデックスヘッダ的な役割をはなせないでいるぽ。

なので、LocalFileHeaderへのオフセットは正当性チェックにも使われないので変な値がはいっててもスルーと言うことなのだろうかw

でも、EndOfCentralDirectoryRecordから逆引きするような展開方法をとっているアーカイバだと、エラーになる可能性がある状態でもあるし。

いろいろと難儀なフォーマットだな……zipって。

とにかく、あとちょっとで終わるぽ。
なんか、あとちょっとってところから結構時間かかっちゃってるなぁ。
関係無い調べ物とかに没頭してたりと、脱線が多い……。

あとは、微妙な嵌りポイントがいくつか。

QTableWidgetのリスト内を、右クリックした状態でドラッグして離すと、コンテキストメニュー呼び出すイベント内で取得出来るリストのindex値は、クリック開始時でなく離した位置のindex値になること。

その場合、リストのcurrentIndexは変更されないので、クリック→currentIndex取得してリストのデータにアクセスみたいな事やってると嵌るぽ。
それに離した位置のindex取得って挙動も違和感あるなぁ……。

それからQTのシグナルとスロットの機構、へんな嵌りポイントがあるぽ。
どうみてもコレであってる筈なのに、No such signal とか抜かしやがるファッキン! とおもってたら、どうやらシグナル名が、どこぞの知らないところですでに使われている名前だったらしく、それでエラーになってたっぽい。
この辺、いろいろ多重継承されてるオブジェクトおおいので、どの名前が使用不可とかよくわからんし、名前の重複が想像できるようなエラーも出ないので嵌るわー。

あとは、どうも最近のQT creatorの挙動が不安定。
ソース変更してても変更部分のビルドが不完全で以前のコードの部分が残ってるかんじで、しょっちゅうリビルド必要ぽ。プリコンパイラ涙目(ぉ

あとui関係追加すると、qmake必要になるっぽい?
この辺はmsvcビルドだからとかあるのかな??

そんな感じで、なんでうごかんのじゃーとおもったらリビルド一発で治ったり、一旦クリーンしてqmakeしてリビルドしたら治ったりとか、コードのバグ以外の所でのエラーに泣かされること多い。
むうう。
Sun
Mon
Tue
Wed
Thu
Fri
Sat
01
02
03
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
31
total:2080615 t:77 y:2908
■記事タイトル■

■年度別リスト■
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)

■レス履歴■

2023-09-26 14:59:38 - 久慈光樹

2023-09-26 14:29:10 - 織田霧さくら

2023-09-26 13:10:45 - 久慈光樹

2023-03-20 05:30:16 - 織田霧さくら

2023-03-15 20:42:58 - まうる

2022-12-26 19:14:57 - 織田霧さくら

2022-12-25 02:28:36 - まうる@まるるん

2022-09-30 04:29:01 - 織田霧さくら

2022-09-23 19:01:29 - まるるん

2022-06-16 21:06:34 - 山本


■ファイル抽出■

■ワード検索■

堕天使の煉獄

https://rengoku.sakura.ne.jp
管理人

織田霧さくら(oda-x)

E-mail (■を@に)

oda-x■rengoku.sakura.ne.jp

堕天使の煉獄バナー 堕天使の煉獄バナー