Ocaml 如何在文件中表示字节?
How are bytes represented in a file by Ocaml?
我正在尝试编写一个函数来将字节列表写入文件(我们正在编写 .class 文件的解析器,并在进行一些插入后将文件写回。)当我合作伙伴编写了读取它的代码,字节码列表变量是一个整数列表。所以现在我需要将它转换为字节,然后将它写入一个新的 .class 文件。十六进制数的表示是否本质上相同,以便 JVM 可以处理新的 .class 文件?我的函数式编程是三年前单学期的 LISP 和一年前 Coq 的一个学期。不足以让我轻松地从功能方面思考。
事实上,您的问题非常令人困惑。下面是一些代码,将文件的字节作为 int 列表读入,然后将 int 作为字节写回新文件。在一个合理的系统上(你没有提到你的系统),这将准确地复制一个文件,这样包括 JVM 在内的任何程序都无法区分。
let get_bytes fn =
let inc = open_in_bin fn in
let rec go sofar =
match input_char inc with
| b -> go (Char.code b :: sofar)
| exception End_of_file -> List.rev sofar
in
let res = go [] in
close_in inc;
res
let put_bytes fn ints =
let outc = open_out_bin fn in
List.iter (fun b -> output_char outc (Char.chr b)) ints;
close_out outc
let copy_file infn outfn =
put_bytes outfn (get_bytes infn)
我在我的系统上测试了这个 (OS X 10.11.2)。我周围没有任何 class 文件,但是 JVM 没有问题 运行 用 copy_file
.
复制的 jarfile
这道题的本质与十六进制数无关。这些是将数字表示为字符串的一种方式,不会出现在任何地方。除了您想用 OCaml 编写代码之外,它与函数式编程也没什么关系。
问题的本质是文件中存储的一系列字节的含义。在最底层,文件中存储的字节是文件的含义。因此,您可以仅通过复制字节来忠实地复制文件。这就是 copy_file
所做的。
既然你想改变字节,你当然需要确保你的新字节代表一个有效的class文件。一旦你弄清楚你想要的新字节,你可以用 put_bytes
(在一个合理的系统上)写出来。
我正在尝试编写一个函数来将字节列表写入文件(我们正在编写 .class 文件的解析器,并在进行一些插入后将文件写回。)当我合作伙伴编写了读取它的代码,字节码列表变量是一个整数列表。所以现在我需要将它转换为字节,然后将它写入一个新的 .class 文件。十六进制数的表示是否本质上相同,以便 JVM 可以处理新的 .class 文件?我的函数式编程是三年前单学期的 LISP 和一年前 Coq 的一个学期。不足以让我轻松地从功能方面思考。
事实上,您的问题非常令人困惑。下面是一些代码,将文件的字节作为 int 列表读入,然后将 int 作为字节写回新文件。在一个合理的系统上(你没有提到你的系统),这将准确地复制一个文件,这样包括 JVM 在内的任何程序都无法区分。
let get_bytes fn =
let inc = open_in_bin fn in
let rec go sofar =
match input_char inc with
| b -> go (Char.code b :: sofar)
| exception End_of_file -> List.rev sofar
in
let res = go [] in
close_in inc;
res
let put_bytes fn ints =
let outc = open_out_bin fn in
List.iter (fun b -> output_char outc (Char.chr b)) ints;
close_out outc
let copy_file infn outfn =
put_bytes outfn (get_bytes infn)
我在我的系统上测试了这个 (OS X 10.11.2)。我周围没有任何 class 文件,但是 JVM 没有问题 运行 用 copy_file
.
这道题的本质与十六进制数无关。这些是将数字表示为字符串的一种方式,不会出现在任何地方。除了您想用 OCaml 编写代码之外,它与函数式编程也没什么关系。
问题的本质是文件中存储的一系列字节的含义。在最底层,文件中存储的字节是文件的含义。因此,您可以仅通过复制字节来忠实地复制文件。这就是 copy_file
所做的。
既然你想改变字节,你当然需要确保你的新字节代表一个有效的class文件。一旦你弄清楚你想要的新字节,你可以用 put_bytes
(在一个合理的系统上)写出来。