【问题标题】:Converting string to binary将字符串转换为二进制
【发布时间】:2018-02-22 18:01:51
【问题描述】:

我有以下问题。 我有一个文件用于存储一些记录的数组(未知结构)。我所知道的所有记录都用“。”分隔。 (点)。此记录的“字段”之一是二进制值。

所以结构是:

multiline_text <<binary_value>> multiline_text .

我可以逐块读取文件(因为它非常大)并解析数据以获取实际数据“”但它不是二进制值它是一个字符串。我正在尝试将其转换为二进制(以转换为后期),但我没有成功。

我尝试使用 BIF list_to_binary(但它不会工作,因为它不是一个列表) - 它已经是一个二进制文件。我尝试将其转换为整数列表,将它们折叠并转换,但它仍然无法正常工作。

我想我缺少一些基本的东西(我是 Erlang 的新手)。 有什么建议吗?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    如果你把你感兴趣的二进制转换成这种格式的字符串,例如:

    S = "<< 1,2,3 >>".
    

    那么你可以这样做:

    > {ok, T, _} = erl_scan:string(S ++ ".").
    > {ok, Term} = erl_parse:parse_term(T). 
    {ok,<<1,2,3>>}
    

    然后您可以使用Term,它实际上将您刚刚读取的二进制文件作为字符串。

    【讨论】:

    • 为我工作。非常感谢!是不是破解?
    • 乍一看,这让我对潜在的注入攻击感到紧张。在使用parse_term 时,这是否是一个毫无根据的怀疑,或者您是否假设二进制值来自受信任的来源?
    • 我认为将字符串转换为二进制文件并没有那么大的问题。这与从文件中读取缓冲区同样不安全。
    【解决方案2】:

    这里是没有 erl_parse 的版本。只是为了学习:

    str2bin(Bin)->
    Bin1 = string:strip(Bin, left, $<),
    Bin2 = string:strip(Bin1, right, $>),
    list_to_binary(lists:map(fun(Str) -> {Int, _Rest} = string:to_integer(string:strip(Str)), Int end, string:tokens(Bin2, ","))).
    

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2019-08-23
      • 1970-01-01
      相关资源
      最近更新 更多