В этом посте за 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
выше).