在 OCaml 中使用字节
Working with bytes in OCaml
我需要表示 8 位整数。我知道 char
是 8 位,但我仍然不确定我将如何执行加法或位移等操作。我想出了:
let ( + ) x y = Char.chr ((Char.code x + Char.code y) mod 256);;
但这似乎大错特错了。
有没有更好的方法可以使用字符来处理字节,或者我应该使用类似 stdint 模块的东西?
嗯,对我来说 所以 似乎并没有什么大错。 Char.code
是一个不生成代码的函数(恒等函数),而 Char.chr
只是检查输入是否在范围内。所以代码量是差不多的。既然你在做 mod 256
,你可以使用 Char.unsafe_chr
,让代码大小更小。
另一方面,OCaml 的内存模型是 char
与 int
占用相同的 space。所以使用 char
.
并没有节省多少
如果您确实需要 8 位值,则可能需要使用它们的序列。为此,您可以使用 Bytes
或 Bigarray
模块。 Bigarray
模块尤其允许您存储字节,但使用常用运算符将它们视为整数。 (Bigarray 存储操作为您执行 mod 256
,即,它会截断超出范围的值。)
我需要表示 8 位整数。我知道 char
是 8 位,但我仍然不确定我将如何执行加法或位移等操作。我想出了:
let ( + ) x y = Char.chr ((Char.code x + Char.code y) mod 256);;
但这似乎大错特错了。
有没有更好的方法可以使用字符来处理字节,或者我应该使用类似 stdint 模块的东西?
嗯,对我来说 所以 似乎并没有什么大错。 Char.code
是一个不生成代码的函数(恒等函数),而 Char.chr
只是检查输入是否在范围内。所以代码量是差不多的。既然你在做 mod 256
,你可以使用 Char.unsafe_chr
,让代码大小更小。
另一方面,OCaml 的内存模型是 char
与 int
占用相同的 space。所以使用 char
.
如果您确实需要 8 位值,则可能需要使用它们的序列。为此,您可以使用 Bytes
或 Bigarray
模块。 Bigarray
模块尤其允许您存储字节,但使用常用运算符将它们视为整数。 (Bigarray 存储操作为您执行 mod 256
,即,它会截断超出范围的值。)