在 Erlang VM 和 NIF 之间传递 BIGINT

Posted

技术标签:

【中文标题】在 Erlang VM 和 NIF 之间传递 BIGINT【英文标题】:Passing BIGINT between Erlang VM and the NIFs 【发布时间】:2019-03-12 01:58:49 【问题描述】:

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

【问题讨论】:

【参考方案1】:

This post from 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)。

【讨论】:

还有一个将字节转换为整数 (BIGINT) 的函数:crypto:bytes_to_ingeger/1

以上是关于在 Erlang VM 和 NIF 之间传递 BIGINT的主要内容,如果未能解决你的问题,请参考以下文章

Erlang NIF 测试——OS X Lion

Erlang NIF 奇怪的 iolist 行为

erlang nif共享库上的未定义符号

Windows上erlang的开发环境

如何在 Erlang 中进行内存映射 IO?

Erlang 更改 VM 进程的初始大小。调整 Erlang 虚拟机