代码之家  ›  专栏  ›  技术社区  ›  jj1bdx

在Erlang VM和NIFs之间传递BIGINT

  •  0
  • jj1bdx  · 技术社区  · 8 年前

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

    1 回复  |  直到 8 年前
        1
  •  4
  •   Dogbert    8 年前

    This post from 2011 表示当时NIFAPI中不支持大整数。我在Erlang/OTP21的文档中找不到任何这样的函数,因此该语句到今天为止可能也是正确的。

    以下是如何将大整数作为字节数组传递:

    从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 上文)。