Erlang NIF 奇怪的 iolist 行为

Posted

技术标签:

【中文标题】Erlang NIF 奇怪的 iolist 行为【英文标题】:Erlang NIF weird iolist behavior 【发布时间】: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 *) 的数据,所以我可能一开始就错了。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

非常感谢,在您的帮助和一点strncpy 的帮助下,我设法解决了问题(我将数据截断为二进制的大小)

以上是关于Erlang NIF 奇怪的 iolist 行为的主要内容,如果未能解决你的问题,请参考以下文章

将二进制文件传递给erlang nif

在 Erlang VM 和 NIF 之间传递 BIGINT

erlang nif共享库上的未定义符号

Erlang:分布式应用程序奇怪的行为

如何正确使用 yaws_api:stream_process_deliver(Socket, IoList)

Windows上erlang的开发环境