我是Erlang爱好者和新手Erlang Prorammer。
我最近不得不面对Erlang中的数据处理问题。因此我决定使用NIF。我有两个支持者名单,我必须根据一个术语返回两个支持者的哈希联接。
为了实现它,我决定在C中学习二进制操作。另外,我使用nifpp库(C ++ 11)来简化我的学习体验。资料来源:https://github.com/goertzenator/nifpp
以下是我可以想到的用于提取和复制二进制文件到另一个ErlNifBinary的代码,该文档已有详细记载。但是我无法操纵它。
ErlNifBinary ebin, bin_term;
nifpp::get_throws(env, argv[0], ebin); // Assigns ebin to the input binary
enif_alloc_binary(16, &bin_term); // Size of new binary
memcpy(bin_term.data, ebin.data, ebin.size); // Copying the contents of binary
我有一个指向bin_term.data中unsigned char的指针。如何更改bin_term.data中的内容?
另外,如果我返回现有的复制二进制文件,我会得到相同输入的不同输出,并且不等于输入,考虑到我刚从输入中处理数据。
return enif_make_binary(env, &bin_term);
在erlang REPL中,如果我用params<<< 7>>执行该函数或者任何其他二进制,我得到的结果为<<<<<<<<<<<<<<<<<<<<<<<或每次一些随机动态值。有人可以指出代码中的错误是什么。
答案 0 :(得分:3)
首先,在初始化bin_term
时,使用静态大小16
字节进行初始化。这就是为什么你的函数总是返回比预期更大的二进制数(如果算数,则为16位数)。所以你要做的第一件事就是创建{Erler
bin_term
enif_alloc_binary(16, &bin_term); // Constant size
enif_alloc_binary(ebin.size, &bin_term); // Same size as binary from Erlang
在nifpp
中,ErlNifBinary called bianry
上有一个包装器,您只需编写
binary bin_term = new binary(ebin.size);
甚至可以添加自己的复制构造函数。
其次,这是访问二进制数据。如果你看看ErlNifBinary
is defined如何通过data
字段(就像你预期的那样)可以访问所有数据,这是指向unsigned char
的指针(换句话说,数组由{ {1}}字段)。
因此,如果您想增加并打印此二进制文件中的每个值,您可以执行类似这样的操作
size
如果你需要一些其他数据表示而不是字符数组(原始内存),你可以查看Resource objects本质上是你的C-memory的智能指针(垃圾收集),可以在Erlang中传递