Scalaでhexdump

30分プログラム、その700。Scalaでhexdumpを作ってみました。

hexdumpは、与えられたファイルを16進数で表示するプログラムです。

$ hexdump a.txt
0000000 61 0a 62 0a 0a 0a 0a
0000007

いわゆるバイナリエディタでみれるやつです。

何かと便利ですよ、これ。swfを直接読んだりするときとかに。

使い方

$ scala HexDump a.txt
61 0a 62 0a 0a 0a 0a

ソースコード

あー、Scalaシンタックスハイライトができるようになったらしいよ。

import java.io._

class BinaryFile(io : InputStream) {
  def map[A](f: Seq[Byte] => A): List[A] = {
    var xs = List[A]()

    for(x <- this){
      xs = f(x) :: xs
    }
    xs reverse
   }

  def foreach(f: Seq[Byte] => Unit) {

    val buffers = new Array[Byte](16)
    try{
      while(true){
	val n = io read buffers
	if(n == -1){
	  return ()
	}else{
	  f(buffers.subArray(0,n))
	}
      }
    }catch{
      case _ : IOException => ()
    }
  }
}

object HexDump {
  def hexDump(path : String) {
    val bin = new BinaryFile(new FileInputStream(path))
    for(xs <- bin){
      xs.foreach(printf("%02x ",_))
      println("")
    }
  }

  def main(args:Array[String]) {
    for(arg <- args) {
      hexDump(arg)
    }
  }
}