OCamlでファイルの読み込み
以下の関数を使うと良さそう
val open_in_bin : string -> in_channel
val input : in_channel -> bytes -> int -> int -> int
input ic buf pos len
val in_channel_length : in_channel -> int
val close_in : in_channel -> unit
ファイルのサイズを確認
code:ocaml
utop # let in_ch = open_in_bin "sample/4649.rom" in in_channel_length in_ch;;
- : int = 28
読み込んだファイルを文字列として出力
code:ocaml
let ic = open_in_bin "sample/4649.S" in
let b = Buffer.create 0 in
(Buffer.add_channel b ic (in_channel_length ic);
print_string (Buffer.contents b));;
読み込んだファイルをBytesとして返す
code:ocaml
let ic = open_in_bin "sample/4649.rom" in
let len = (in_channel_length ic) in
let b = Buffer.create len in
(Buffer.add_channel b ic len;
Buffer.to_bytes b);;
sample/4649.rom の中身
code:sh
$ hexdump sample/4649.rom
0000000 93 00 60 04 13 01 90 04 13 00 00 00 13 00 00 00
0000010 13 00 00 00 13 00 00 00 13 00 00 00
000001c
メモ
4649.romの文字列リテラルと読み込んだファイルのハッシュ値を確認、同じだった。
code:ocaml
utop # let d = Digest.string "\x93\x00\x60\x04\x13\x01\x90\x04\x13\x00\x00\x00\x13\x00\x00\x00\x13\x00\x00\x00\x13\x00\x00\x00\x13\x00\x00\x00" in Digest.to_hex d;;
- : string = "770d19c4b8563c640676f1e50eb97b40"
code:ocaml
utop # let ic = open_in_bin "sample/4649.rom" in
let len = (in_channel_length ic) in
let b = Buffer.create len in
(Buffer.add_channel b ic len;
Digest.to_hex (Digest.string (Buffer.contents b)));;
- : string = "770d19c4b8563c640676f1e50eb97b40"