【问题标题】:String version of term_to_binaryterm_to_binary 的字符串版本
【发布时间】:2010-10-21 16:56:35
【问题描述】:

我正在尝试编写一个通过 tcp 与客户端通信的简单服务器。我让它发送消息就好了,但现在我希望它把消息解释为 Erlang 数据类型。例如,假设它类似于 HTTP(不是),并且我想从客户端 {get, "/foo.html"} 发送并让服务器将其解释为包含原子和列表的元组,而不仅仅是一个大列表或二进制文件。

我可能最终会使用term_to_binarybinary_to_term,但是调试基于文本的协议要容易得多,所以我希望找到一个对列表更友好的版本。有没有藏在什么地方的?

【问题讨论】:

    标签: serialization tcp erlang messages custom-protocol


    【解决方案1】:

    您可以通过以下方式将字符串解析为表达式(类似于file:consult):

    % InputString = "...",
    {ok, Scanned, _} = erl_scan:string(InputString),
    {ok, Exprs} = erl_parse:parse_exprs(Scanned),
    {value, ParsedValue, _} = erl_eval:exprs(Exprs, [])
    

    (见http://www.trapexit.org/String_Eval

    您应该能够使用io_lib:format 将表达式转换为使用~w~p 格式代码的字符串,例如io_lib:format("~w", [{get, "/foo.html"}])

    我认为这不会很快,所以如果性能是一个问题,你可能不应该使用这样的字符串。

    还请注意,这可能是不安全的,因为您正在评估任意表达式 - 如果您走这条路,您可能应该对中间输出进行一些检查。我建议查看erl_parse:parse_exprs 的结果,以确保它包含您感兴趣的格式(即,它始终是 {atom(), list()} 的元组),没有嵌入式函数调用。您应该能够通过模式匹配来做到这一点。

    【讨论】:

    • 这正是我想要的。这是用于调试和开发的,因此性能几乎不是问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    相关资源
    最近更新 更多