人気ブログランキング | 話題のタグを見る

Data.ByteString.Lazy

前回、Data.ByteString.readFile がバッファー不足で作動しなかったが、どうやら Data.ByteString は正格で動作するらしい。つまり、ファイルのデータを一度すべて読み込まなくては次の動作に移れないということだ。

調べてみたら、Data.ByteString.Lazy をインポートすれば遅延評価で動作するのでバッファの問題も起きないのではないかと思って試してみた。

Prelude> import qualified Data.ByteString.Lazy as B
Prelude B> B.readFile "hello.exe" >>= print

無限ループに陥ったのではないかというくらい、すべての表示に時間がかかったが、無事バイナリデータを表示することができた。

気になったので dir でファイルを調べてみたら、ソースファイルの hello.hs は 32 バイトなのに、実行ファイルの hello.exe は 1,114,253 バイトもあった。なんで?

2012/12/06 21:45 1,114,253 hello.exe
2012/12/06 21:45 556 hello.hi
2012/12/06 21:45 32 hello.hs
2012/12/06 21:44 25 hello.hs~
2012/12/06 21:45 1,882 hello.o

そこで、hello.exe の最初の 200 バイトを表示したら次のようになった。

Prelude B> do B.readFile "hello.exe" >>= return . (B.take 200) >>= print; putStr
Ln ""
Loading package bytestring-0.9.2.1 ... linking ... done.
Chunk "MZ\144\NUL\ETX\NUL\NUL\NUL\EOT\NUL\NUL\NUL\255\255\NUL\NUL\184\NUL\NUL\NUL\NUL\NUL\NUL\NUL@\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\128\NUL\NUL\NUL\SO\US\186\SO\NUL\180\t\205!\184\SOHL\205!This program cannot be run in DOS mode.\r\r\n$\NUL\NUL\NUL\NUL\NUL\NUL\NULPE\NUL\NULL\SOH\DC2\NUL\133\147\192P\NUL\152\t\NUL180H\NUL\NUL\224\NUL\a\SOH\v\SOH\STX\DC4\NULb\a\NUL\NULh\t\NUL\NUL>\NUL\NUL`\DC1\NUL\NUL\NUL\DLE\NUL\NUL\NUL\128\a\NUL\NUL\NUL@\NUL\NUL\DLE
\NUL\NUL\NUL\STX\NUL\NUL\EOT\NUL\NUL\NUL\SOH\NUL\NUL\NUL" Empty

This program cannot be run in DOS mode という文が見える。実行コード以外に色々な情報が埋め込まれているのだろう。それにしても、実行ファイルの大きさが尋常でない。ランタイムルーチンを全部取り込むからだろう。
by tnomura9 | 2012-12-08 08:35 | Haskell | Comments(0)
<< Text.Printf バイナリファイルを読む >>