ByteString で hexDump

ByteString の練習に HEXDUMP してみました。

それぞれに Data.List と同じような関数が定義されています。

import Numeric
import qualified Data.ByteString.Lazy as L

hexDump :: FilePath -> IO ()
hexDump path = L.readFile path >>= printHex 16

printHex :: Int -> L.ByteString ->  IO ()
printHex cnt bstring  = 
    case L.length bstring > 0 of
      True  -> do
             putStr $ reverse $ take 3 $ reverse $ "00" ++ showHex (L.head bstring) " " 
             case cnt of
                 0 -> newLine >> printHex 16 bsTail
                 _ -> printHex (cnt-1) bsTail
      False -> newLine
    where
        bsTail  = L.tail bstring
        newLine = putStr "\n"

main = hexDump "./bytestring"
$ ./bytestring|more
7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 02 
00 03 00 01 00 00 00 40 9e 04 08 34 00 00 00 b4 67 
06 00 00 00 00 00 34 00 20 00 09 00 28 00 1f 00 1c 
00 06 00 00 00 34 00 00 00 34 80 04 08 34 80 04 08 
20 01 00 00 20 01 00 00 05 00 00 00 04 00 00 00 03 
00 00 00 54 01 00 00 54 81 04 08 54 81 04 08 13 00 
00 00 13 00 00 00 04 00 00 00 01 00 00 00 01 00 00 
00 00 00 00 00 00 80 04 08 00 80 04 08 68 0f 06 00 
68 0f 06 00 05 00 00 00 00 10 00 00 01 00 00 00 e0 
1e 06 00 e0 9e 0a 08 e0 9e 0a 08 84 47 00 00 d4 77 
00 00 06 00 00 00 00 10 00 00 02 00 00 00 f8 1e 06 
  (snip)