在OCaml中使用字节

在OCaml中使用字节,ocaml,Ocaml,我需要表示8位整数。我知道一个字符是8位的,但我仍然不确定如何执行加法或位移位等操作。我想到了: let ( + ) x y = Char.chr ((Char.code x + Char.code y) mod 256);; 但这似乎大错特错 有没有更好的方法可以使用字符来处理字节,或者我应该使用类似stdint模块的东西?好吧,我觉得它并没有那么可怕的错误Char.code是一个不生成代码的函数(标识函数),而Char.chr只是检查输入是否在范围内。所以代码的数量是正确的。由于您正在执行

我需要表示8位整数。我知道一个字符是8位的,但我仍然不确定如何执行加法或位移位等操作。我想到了:

let ( + ) x y = Char.chr ((Char.code x + Char.code y) mod 256);;
但这似乎大错特错

有没有更好的方法可以使用字符来处理字节,或者我应该使用类似stdint模块的东西?

好吧,我觉得它并没有那么可怕的错误
Char.code
是一个不生成代码的函数(标识函数),而
Char.chr
只是检查输入是否在范围内。所以代码的数量是正确的。由于您正在执行
mod 256
,因此可以使用
Char.unsafe\u chr
,使代码的大小更小

另一方面,OCaml的内存模型是这样的:
char
int
占用相同的空间。因此,使用
char
不会节省很多钱

如果您真的想要8位值,那么可能需要处理它们的序列。为此,您可以使用
Bytes
Bigarray
模块。特别是,
Bigarray
模块允许您存储字节,但使用常用的运算符将它们视为int。(Bigarray存储操作为您执行
mod 256
,即截断超出范围的值。)

好吧,我觉得它似乎没有那么可怕的错误
Char.code
是一个不生成代码的函数(标识函数),而
Char.chr
只是检查输入是否在范围内。所以代码的数量是正确的。由于您正在执行
mod 256
,因此可以使用
Char.unsafe\u chr
,使代码的大小更小

另一方面,OCaml的内存模型是这样的:
char
int
占用相同的空间。因此,使用
char
不会节省很多钱

如果您真的想要8位值,那么可能需要处理它们的序列。为此,您可以使用
Bytes
Bigarray
模块。特别是,
Bigarray
模块允许您存储字节,但使用常用的运算符将它们视为int。(Bigarray存储操作为您执行
mod 256
,即截断超出范围的值。)