繁体   English   中英

在Erlang VM和NIF之间传递BIGINT

[英]Passing BIGINT between Erlang VM and the NIFs

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

2011年的这篇文章说,当时NIF API不支持大整数。 我在Erlang / OTP 21的文档中找不到任何这样的函数,因此该语句到目前为止也可能是正确的。

这是将大整数作为字节数组传递的方法:

从Erlang,而不是直接传递整数,而是传递两个值:整数的符号和通过对整数调用binary:encode_unsigned/1获得的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以上)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM