現実逃避に、昨日言ってた、複数の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も違うし…。
しばらくネットさまよって、バイナリにパックしてしまえばいいんじゃね的な発想に至りました。
あれー?と思って、色々試してみると、0x89を消すとひっかかる事に気づく。
もちろん調べてみた。
あ、そうか、utf-8でパックしたからダメなのかな、って事で調べてみた。
って所で止まってます。原因の範囲が分かってもこれ以上どう進めばいいか分からない。
正直パックとか文字コードとか今日初めて真面目にやったので意味わからなすぎ。原因どこだー。
何か簡単に探せる違う方法も考えつつ、気になるので今日中にどうにかしときます。
でもって明日からは勉強!(毎回そう言ってる
いい加減留年の危機から開放されたい。ほんとやらねば。
追記:
30分考えたけど正直さっぱり分からなかった。
テスト開けたら、パックするほうか、全然違う方法か、どちらにしろ何か考えます。
追記2:
packのオプションをcにしたら(正確にはc*にしたら)普通に通った。
それ使ったら、くっつけてた画像を元に戻せたので、今度気が向いたらStar Rubyで実装してブログ書いときます。明日かもしれませんが、下手するとテスト後。まぁ手元にプログラムあるから大丈夫でしょう…たぶん。
昨日の時点では思いつきだったので言ってる事がアレですが、やっぱ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も違うし…。
しばらくネットさまよって、バイナリにパックしてしまえばいいんじゃね的な発想に至りました。
まず、これは動かなかった。ASCII文字列に変換できないらしい。head = [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a]
#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(head.pack("A*"))
puts a
表示されるのはnil。つまり無い。head = [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a]
#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(head.pack("U*"))
puts a
あれー?と思って、色々試してみると、0x89を消すとひっかかる事に気づく。
表示されるのは1。もしかして、先頭にある0byte目は0x89じゃないってこと?head = [0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a]
#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(head.pack("U*"))
puts a
もちろん調べてみた。
表示されるのは何と0。つまり0x89は0byte目にちゃんとある。まじかー意味わかんねー。#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(0x89)
puts a
あ、そうか、utf-8でパックしたからダメなのかな、って事で調べてみた。
表示されるのはnil。ここか。head = [0x89]
#fileにはreadで読み込んだpngの画像の中身がある
a = file.index(head.pack("U*"))
puts a
って所で止まってます。原因の範囲が分かってもこれ以上どう進めばいいか分からない。
正直パックとか文字コードとか今日初めて真面目にやったので意味わからなすぎ。原因どこだー。
何か簡単に探せる違う方法も考えつつ、気になるので今日中にどうにかしときます。
でもって明日からは勉強!(毎回そう言ってる
いい加減留年の危機から開放されたい。ほんとやらねば。
追記:
30分考えたけど正直さっぱり分からなかった。
テスト開けたら、パックするほうか、全然違う方法か、どちらにしろ何か考えます。
追記2:
packのオプションをcにしたら(正確にはc*にしたら)普通に通った。
それ使ったら、くっつけてた画像を元に戻せたので、今度気が向いたらStar Rubyで実装してブログ書いときます。明日かもしれませんが、下手するとテスト後。まぁ手元にプログラムあるから大丈夫でしょう…たぶん。




head = [0x89]
a = file.index(head.pack("C*"))
puts a
裏で散々オプションを試した挙句、同じ事書いて更新したところです…コメントに今気づきました…。
ちょっとこのあたりは難しかったです。自分の力量不足を痛感しました…。