将二进制文件传递给erlang nif

Posted

技术标签:

【中文标题】将二进制文件传递给erlang nif【英文标题】:Passing a binary to erlang nif 【发布时间】:2012-07-04 11:59:56 【问题描述】:

我正在编写一些 Erlang 代码,它基本上接受来自 TCP 连接的一些二进制数据,然后使用 C nif 解密数据并返回解密后的数据。

问题是我似乎无法弄清楚如何修改传入的二进制文件。

这是我正在使用的功能。如果有人能指出我正确的方向,我将不胜感激。

static ERL_NIF_TERM decrypt(ErlNifEnv* env, ErlNifBinary *data);

谢谢!

【问题讨论】:

您确定修改二进制文件是正确的方法吗?据我了解,二进制文件可能会汇集在虚拟机中,修改一个二进制文件实际上可能会修改“不相关”的数据。为什么不返回一个新的二进制文件? 【参考方案1】:

您不能修改传递的二进制文件。您需要先制作副本并修改复制的二进制文件,然后将复制的(=修改的)二进制文件返回给调用者。

记住二进制文件是在共享堆中分配的;如果你覆盖原来的,你会遇到麻烦,因为这违反了 Erlang 的单一赋值原则。

详情请见an example of handling binary arguments in sfmt-erlang NIF code。

【讨论】:

以上是关于将二进制文件传递给erlang nif的主要内容,如果未能解决你的问题,请参考以下文章

创建仅二进制的 Erlang 版本

Erlang io:将二进制文件格式化为十六进制

将Java套接字文件描述符传递给C二进制文件的最有效方法

如何在 Erlang 中进行内存映射 IO?

如何在 Erlang 中找到 utf8 编码二进制文件的字符长度?

erlang beam code文件怎么打开