Erlang NIF странное поведение iolist

Я только начал экспериментировать с Erlang NIFS и застрял с этой проблемой, и мне интересно, можно ли что-нибудь с этим поделать.

Вот НИФ:

#include "erl_nif.h"

static ERL_NIF_TERM test_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    ErlNifBinary binary;
    if (!enif_inspect_iolist_as_binary(env, argv[0], &binary)) {
        return enif_make_badarg(env);
    }

    printf("%s\n", binary.data);

    return enif_make_int(env, 0);
}

static ErlNifFunc nif_funcs[] = {
    {"test", 1, test_nif}
};

ERL_NIF_INIT(nif_test, nif_funcs, NULL, NULL, NULL, NULL)

и некоторые результаты, когда я вызываю функцию из erlang:

nif_test:test(<<"helló">>). % hell?
nif_test:test(<<"áéíóöőüű">>). % ?????Q?q
nif_test:test("hello"). % helloErlU?
nif_test:test(""). % xc?
nif_test:test("out"). % outg", "U?

Было бы неплохо, чтобы хотя бы двоичные строки работали правильно. Есть идеи?

Редактировать: я забыл, что мне на самом деле нужны данные в виде строки (char *) в программе C, поэтому я мог начать все это неправильно.


person kristóf baján    schedule 31.01.2020    source источник


Ответы (1)


Первые два связаны с тем, что printf не учитывает любую кодировку символов, которую вы используете в исходном файле Erlang (вероятно, UTF-8).

Остальные потому, что ErlNifBinary не завершается нулем. Также нужно обратить внимание на binary.size. Что-то вроде этого:

 printf("%.*s", binary.size, binary.data);
person Roger Lipscombe    schedule 31.01.2020
comment
Большое спасибо, мне удалось решить проблему с вашей помощью и немного strncpy (обрезал данные до размера бинарника) - person kristóf baján; 31.01.2020