有没有一种有效的方法在 Erlang VM 和 NIF 之间传递 BIGINT(x86_64/amd64 架构的整数超过 64 位)?到目前为止,我还没有在enif
模块中找到支持功能。也许将 BIGINT 转换为二进制文件会有所帮助,但可能还有另一种好方法。
问问题
156 次
1 回答
4
这篇 2011 年的帖子说当时 NIF API 中不支持大整数。我在 Erlang/OTP 21 的文档中找不到任何这样的函数,因此该声明在今天也很可能是正确的。
以下是如何将大整数作为字节数组传递:
在 Erlang 中,不是直接传递整数,而是传递两个值:整数的符号和通过调用binary:encode_unsigned/1
整数获得的二进制数。
Integer = ...,
my_nif_function(Integer < 0, binary:encode_unsigned(Integer)).
在 NIF 函数中,您可以使用以下命令访问第二个参数的字节enif_inspect_binary
:
ErlNifBinary bin;
enif_inspect_binary(env, bin_term, &bin); // make sure to check the return value of this function in the real code
bin.data
现在指向bin.size
字节,表示以大端序排列的整数字节(如果你想要小端序,little
作为上面的第二个参数传递binary:encode_unsigned/2
)。
于 2018-10-08T02:20:43.233 回答