【问题标题】:Convert erlang terms to string, or decode erlang binary将 erlang 术语转换为字符串,或解码 erlang 二进制
【发布时间】:2012-03-14 11:23:17
【问题描述】:

我有一个生成数据的 erlang 程序。此数据需要通过 udp 传输到非 erlang 程序以进行进一步处理。我已经让这部分工作了——通过 udp 发送数据并在另一个非 erlang 端接收它。

这就是问题所在。数据(像包含列表的元组这样的 erlang 术语)似乎无法“按原样”处理(即我不能只发送任意的 erlang 术语)。它显然需要先转换为文本或二进制。使用我发现的 bif 转换为二进制似乎很容易。问题是,二进制 gobbledygook 从另一边出来,我不知道有什么简单的方法来解码它(另一边是 non-erlang)。

除非有人告诉我一些简单的方法来解码二进制 gobbledygook,否则我希望将数据作为术语的简单字符串表示形式发送 - 例如像这样的元组:

{[1,2,3],[4,5,6]}

这样发送:

"{[1,2,3],[4,5,6]}"

我没有看到任何这样的 bif,即“convert_term_to_ascii/1”等。我知道我可以扫描它并发送术语的令牌表示,但我不想这样做 - 在另一边解码只是我不想面对的痛苦。

我知道我不是第一个、第二个或第三个遇到此问题的人。它必须相当普遍。一般是怎么处理的?

有人可以指点我一些资源,向我展示如何 1)将二进制 gobbledygook 转换为 ascii(非 erlang 端需要),或 2)直接将术语转换为字符串(erlang 端需要)?

或者,告诉我我哪里错了,我应该怎么做?

谢谢。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    我建议使用任一已知库将 erlang 术语转换为 JSON(听到关于 rfc4267 的好话)。我猜,将 JSON 转换回任何非 erlang 平台都是一项微不足道的任务。 )

    【讨论】:

    • 另一个值得一看的 Erlang JSON 库是 jsx - 我将它用于所有 Erlang 服务器 -> C++ 客户端,它快速、可靠且易于使用。
    • 在决定使用 JSON 之前,请记住 Erlang 和 JSON 类型之间没有映射关系。特别是,JSON(和 YAML)缺乏原子、二进制数据的直接表示,以及数字作为字符串的区别(以及在浮点数与整数之间)。您必须选择一种中间格式或示意图翻译来区分字符串和二进制文件和列表,以及原子和字符串,并且每个 JSON 库都会有所不同。 BIF term_to_binary/1 binary_to_term/1 是精确的,并且可以与各种语言的 BERT 库 (bert-rpc.org) 一起使用。
    【解决方案2】:

    1) 您可以使用

    将任何术语转换为字符串
    R= io_lib:format("~p",[yourtermhere]),
    lists:flatten(R)
    

    2) 您可能会查看 erlang 外部二进制格式,许多其他语言都有用于编码/解码该 erlang 二进制格式的库。在 erlang 中,您可以通过 term_to_binary 对任何术语进行编码

    【讨论】:

    • 刚刚遇到了一个相关问题,将作为 file:consult/1 的有效输入格式的二进制或字符串转换为 Erlang 术语,但不是从文件开始。我决定为我未来的自己记录解决方案,也许其他人会发现它有帮助:zxq9.com/archives/1354
    猜你喜欢
    • 2017-06-09
    • 2013-02-14
    • 2022-01-03
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2014-08-27
    相关资源
    最近更新 更多