【问题标题】:Erlang NIF weird iolist behaviorErlang NIF 奇怪的 iolist 行为
【发布时间】:2020-05-17 09:07:32
【问题描述】:

我刚开始使用 Erlang NIFS 进行实验,遇到了这个问题,我想知道是否有什么可以解决的。

这是 NIF:

#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?

至少让二进制字符串正常工作会很好。有什么想法吗?

编辑: 我忘记了我真正需要的是 C 程序中作为字符串 (char *) 的数据,所以我可能一开始就错了。

【问题讨论】:

    标签: erlang erlang-nif


    【解决方案1】:

    前两个是因为printf 不支持您在 Erlang 源文件中使用的任何字符编码(可能是 UTF-8)。

    其余的都是因为ErlNifBinary 不是以空值结尾的。您还需要关注binary.size。像这样的:

     printf("%.*s", binary.size, binary.data);
    

    【讨论】:

    • 非常感谢,在您的帮助和一点strncpy 的帮助下,我设法解决了问题(我将数据截断为二进制的大小)
    猜你喜欢
    • 2011-06-14
    • 2012-10-17
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2015-01-02
    • 2011-09-18
    • 2011-03-25
    相关资源
    最近更新 更多