在 Erlang VM 和 NIF 之间传递 BIGINT



有没有一种有效的方法可以在 Erlang VM 和 NIF 之间传递 BIGINT(x86_64/amd64 架构超过 64 位的整数(?到目前为止,我还没有在enif模块中找到支持功能。也许将 BIGINT 转换为二进制文件会有所帮助,但可能还有另一种好方法。

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的第二个参数传递(。

相关内容

  • 没有找到相关文章

最新更新