在Erlang VM和NIF之间传递BIGINT

时间:2018-10-07 01:00:33

标签: erlang bigint erlang-nif

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

1 个答案:

答案 0 :(得分:2)

I'm getting an error authenticating with Password-JWT说,NIF API当时不支持大整数。我在Erlang / OTP 21的文档中找不到任何这样的函数,因此该语句到目前为止也可能是正确的。

以下是您可以将大整数作为字节数组传递的方法:

从Erlang,而不是直接传递整数,而是传递两个值:整数的符号和通过对整数调用binary:encode_unsigned/1获得的二进制。

Integer = ...,
my_nif_function(Integer < 0, binary:encode_unsigned(Integer)).

在NIF函数中,您可以使用This post from 2011访问第二个参数的字节:

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个字节,以Big Endian顺序表示整数的字节(如果要使用Little Endian,请将little作为第二个参数传递给{{1} })。