【问题标题】:Erlang howto make a list from this binary <<"a,b,c">>Erlang 如何从这个二进制文件中创建一个列表 <<"a,b,c">>
【发布时间】:2011-09-02 18:47:00
【问题描述】:

我有一个二进制文件&lt;&lt;"a,b,c"&gt;&gt;,我想从这个二进制文件中提取信息。

所以我想要A=a, B=b 之类的东西。 我需要一个通用的方法,因为二进制字符串总是在变化。

所以它可能是&lt;&lt;"aaa","bbb","ccc"&gt;&gt;...

我试图生成一个列表

erlang:binary_to_list(<<"a","b","c">>) 

但结果我得到了字符串。

"abc"

谢谢。

【问题讨论】:

    标签: string list binary erlang


    【解决方案1】:

    您确实使用了正确的方法。

    binary_to_list(Binary) -> [char()]

    返回与二进制字节对应的整数列表。

    Erlang 中没有字符串类型:http://www.erlang.org/doc/reference_manual/data_types.html#id63119。如果所有元素都在可打印的 ASCII 范围内,控制台只会以字符串表示形式显示列表。

    您应该阅读 Erlang 的 "Bit Syntax Expressions" 文档以了解如何处理二进制文件。

    如果在列表表示中不需要它,请不要将整个二进制文件转换为列表!

    要提取您可以使用的前三个字节

    <<A, B, C, Rest/binary>> = <<"aaa","bbb","ccc">>.
    

    如果要遍历二进制数据,可以使用二进制推导。

    << <<(F(X))>> || <<X>> <= <<"aaa","bbb","ccc">> >>.
    

    模式匹配也是可能的:

    test(<<A, Tail/binary>>, Accu) -> test(Tail, Accu+A);
    test(_, Accu) -> Accu.
    
    882 = test(<<"aaa","bbb","ccc">>, 0).
    

    即使是一次读取一个 UTF-8 字符。所以要将convert a binary UTF-8 string 转换为 Erlang 的“代码点列表”格式,您可以使用:

    test(<<A/utf8, Tail/binary>>, Accu) -> test(Tail, [A|Accu]);
    test(_, Accu) -> lists:reverse(Accu).
    
    [97,97,97,600,99,99,99] = test(<<"aaa", 16#0258/utf8, "ccc">>, "").
    

    (注意`&lt;&lt;"aaa","bbb","ccc"&gt;&gt; = &lt;&lt;"aaabbbccc"&gt;&gt;。实际上不要使用最后截取的代码,而是使用链接方法。)

    【讨论】:

    • 感谢您的宝贵时间,问题是我确实需要二进制的列表表示。我想从二进制文件中构建类似 [{user, andreas},{adress,germany}] 的结构。我永远不知道必须提取多少字节 id 才能获得第一个 Term {user,adreas}。我想我可以使用二进制 > 并将这个二进制转换为列表,这样我就可以从二进制中获取信息。
    • 您想在给定的标记处拆分二进制数据吗? stackoverflow.com/questions/428124/…
    • 我在link 尝试了解决方案,它可以工作,但这不是解决我的问题的优雅方法,因为我必须禁止在我的应用程序中使用特殊令牌。
    • 你会如何分隔&lt;&lt;user,andreas,address,germany&gt;&gt; 中的字段?逗号实际上并没有出现在二进制文件中。但我想说 0 是一个相当安全的字符……用于分隔文本数据……
    • 好吧,我所做的是binary:split(&lt;&lt;"{aaa,aa0a}\0{bbb,ccc}"&gt;&gt;,[&lt;&lt;"\0"&gt;&gt;],[global]).,结果我得到[&lt;&lt;"{aaa,aa0a}"&gt;&gt;,&lt;&lt;"{bbb,ccc}"&gt;&gt;]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多