将字符串转换为二进制
问题描述:
我遇到以下问题。 我有一个文件,用于存储一些记录数组(未知结构)。我所知道的所有记录都以“。”隔开。 (点)。这个记录的其中一个“字段”是二进制值。将字符串转换为二进制
所以结构:
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
,它实际上具有刚刚读取为字符串的二进制文件。
答
这里是没有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, ","))).
适合我。非常感谢!它是否破解? – ravnur
这不是黑客。 Erlang是如何在内部解释代码的...... –
乍一看,这让我对潜在的注入攻击感到紧张。在使用'parse_term'时,这是一个毫无根据的怀疑,还是假设二进制值来自可信来源? – Inaimathi