Передача BIGINT между Erlang VM и NIFs - PullRequest
0 голосов
/ 07 октября 2018

Существует ли эффективный способ передачи BIGINT (целые числа, превышающие 64 бита для архитектур x86_64 / amd64) между Erlang VM и NIF?До сих пор я не нашел вспомогательную функцию в модуле enif.Возможно, преобразование BIGINT в двоичные файлы поможет, но может быть и другой хороший способ.

1 Ответ

0 голосов
/ 08 октября 2018

В этом посте за 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 байтов, представляющих байты целого числа в старшем порядкеorder (если вы хотите Little Endian, передайте little в качестве второго аргумента binary:encode_unsigned/2 выше).

...