将字符串转换为二进制

问题描述:

我遇到以下问题。 我有一个文件,用于存储一些记录数组(未知结构)。我所知道的所有记录都以“。”隔开。 (点)。这个记录的其中一个“字段”是二进制值。将字符串转换为二进制

所以结构:

multiline_text <<binary_value>> multiline_text . 

我可以读文件块逐块(因为它相当大的),并分析数据,以获得实际数据“<>”,但它不是一个二进制值,它是一个串。我试图将其转换为二进制(转换为期限较晚),但我没有成功。

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

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

如果你得到你有兴趣进入这一格式的字符串二进制,例如:

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

那么你可以做这样的事情:

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

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

+0

适合我。非常感谢!它是否破解? – ravnur

+0

这不是黑客。 Erlang是如何在内部解释代码的...... –

+0

乍一看,这让我对潜在的注入攻击感到紧张。在使用'parse_term'时,这是一个毫无根据的怀疑,还是假设二进制值来自可信来源? – Inaimathi

这里是没有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, ","))).