c-通过NIF创建一个Erlang二进制文件,数据指向一个char*



我正在使用NIF进行C-Erlang集成,在初始化Binary和添加指向其数据的char*时遇到了一些问题。

我是这样做的:

ErlNifBinary *output_binary;
enif_alloc_binary(500, output_binary);
strcpy(output_binary->data, "Here is a string");
return enif_make_binary(env, output_binary); 

你知道我做得不对吗?我有一个分割错误。

UPDATE:我消除了分段错误。但是现在我不能返回包含String的Erlang二进制文件。

enif_make_stringbinary.data在Erlang上得到一个String。但当我尝试将enif_make_binary与二进制文件一起使用时,我得到了类似<<0,0,0,0,0,0,0,0,112,40,129,20>>的东西,我需要做什么来转换?

output_binary对象分配内存,但output_binary->data指向一个无效对象。您可以通过以下方式为output_binary->data分配内存:

output_binary->data = malloc(sizeof "Here is a string");  // or enif_alloc
strcpy(output_binary->data, "Here is a string");

刚刚发现问题。

我应该返回一个二进制的地址,而不是二进制的,所以只要一个return enif_make_binary(env, &output_binary);就可以了。

对于任何正在寻找它的人来说,它在C或C++中实际上很容易。

您需要分配ErlNifBinary对象(而不是字符串)。通过调用enif_make_binary创建ERL_NIF_TERM后,ErlNifBinary将变为只读,所有权将转移到ERL_NIF_TERM。您可以有效地忘记ErlNifBinary对象。

ErlNifBinary bin;
std::string str = "hi there";
enif_alloc_binary(str.size(), &bin);
strcpy((char*)bin.data, str.c_str());
bin.size = str.size();
ERL_NIF_TERM term = enif_make_binary(env,&bin);

如果您使用纯C语言,那么静态字符串也同样有效。

ErlNifBinary bin;
const char * str = "hi there";
enif_alloc_binary(strlen(str), &bin);
strcpy((char*)bin.data, str);
bin.size = strlen(str);
ERL_NIF_TERM term = enif_make_binary(env,&bin);

相关内容

  • 没有找到相关文章

最新更新