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 行为的主要内容,如果未能解决你的问题,请参考以下文章