現実逃避に、昨日言ってた、複数のpngを一つにまとめてプログラム内で分解、というやつをやってました。
昨日の時点では思いつきだったので言ってる事がアレですが、やっぱio_lengthに長さを指定して分解ですね。2つめのファイルからは、io_lengthで渡した分だけシークした後に、io_lengthに読み込むファイルの長さを渡すんだー。まぁ当たり前ですよね…。

さて、ファイルの長さを調べるわけですが、wikiのpngのところにヘッダの事とか詳しく書いていて、ヘッダとヘッダの間隔(またはヘッダとIENDのチャンクまでの間隔)が分かればいいんだな、楽勝だわーとか思ってたのにできねえええええ。
とりあえずreadで読んだファイルの中身を使って、ヘッダの89 50 4E 47 0D 0A 1A 0A(すべて16進数)をindexで調べるテストを書こう…と思ったけど書き方が分からない。文字列みたくindex(0x890x50)とか書けないし、かと言ってindex(0x8950)とか違う数値だし、to_sも違うし…。
しばらくネットさまよって、バイナリにパックしてしまえばいいんじゃね的な発想に至りました。

head = [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a]
#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(head.pack("A*"))
puts a

まず、これは動かなかった。ASCII文字列に変換できないらしい。

head = [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a]
#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(head.pack("U*"))
puts a

表示されるのはnil。つまり無い。
あれー?と思って、色々試してみると、0x89を消すとひっかかる事に気づく。

head = [0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a]
#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(head.pack("U*"))
puts a

表示されるのは1。もしかして、先頭にある0byte目は0x89じゃないってこと?
もちろん調べてみた。

#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(0x89)
puts a

表示されるのは何と0。つまり0x89は0byte目にちゃんとある。まじかー意味わかんねー。
あ、そうか、utf-8でパックしたからダメなのかな、って事で調べてみた。

head = [0x89]
#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(head.pack("U*"))
puts a

表示されるのはnil。ここか。

って所で止まってます。原因の範囲が分かってもこれ以上どう進めばいいか分からない。
正直パックとか文字コードとか今日初めて真面目にやったので意味わからなすぎ。原因どこだー。
何か簡単に探せる違う方法も考えつつ、気になるので今日中にどうにかしときます。

でもって明日からは勉強!(毎回そう言ってる
いい加減留年の危機から開放されたい。ほんとやらねば。


追記:
30分考えたけど正直さっぱり分からなかった。
テスト開けたら、パックするほうか、全然違う方法か、どちらにしろ何か考えます。

追記2:
packのオプションをcにしたら(正確にはc*にしたら)普通に通った。
それ使ったら、くっつけてた画像を元に戻せたので、今度気が向いたらStar Rubyで実装してブログ書いときます。明日かもしれませんが、下手するとテスト後。まぁ手元にプログラムあるから大丈夫でしょう…たぶん。
2008.11.22 Sat l Star Ruby l COM(3) TB(0) l top ▲

コメント

No title
16 進法の数値の配列を、バイト列の文字列にするのは、 pack の C (unsigned char) を使います。というわけで、これでいけませんか。

head = [0x89]
a = file.index(head.pack("C*"))
puts a
2008.11.23 Sun l 星一. URL l 編集
No title
ああああ、わざわざすいません、ありがとうございます。
裏で散々オプションを試した挙句、同じ事書いて更新したところです…コメントに今気づきました…。

ちょっとこのあたりは難しかったです。自分の力量不足を痛感しました…。
2008.11.23 Sun l かぜきょう. URL l 編集
No title
あ、深く考えずにコメントしてしまいましたが、テンプレートにはcharを使って動かしたのですがunsigned charを使ったほうがいいですね。
2008.11.23 Sun l かぜきょう. URL l 編集

コメントの投稿












       

トラックバック

トラックバックURL
→http://kazekyou.blog61.fc2.com/tb.php/198-280ef925
この記事にトラックバックする(FC2ブログユーザー)