2012-06-08 2 views
2

다음과 같은 문제점이 있습니다. 일부 레코드 (알 수없는 구조)의 배열을 저장하는 데 사용되는 파일이 있습니다. 내가 아는 모든 기록은 "."으로 구분됩니다. (점). 이 레코드의 "필드"중 하나는 이진 값입니다. 나는 덩어리별로 덩어리 (그것은 꽤 큰 때문에) 파일을 읽고 데이터를 분석 할 수 문자열을 바이너리로 변환

multiline_text <<binary_value>> multiline_text . 

는 "<>"실제 데이터를 얻을 수 있지만, 그것의 이진 값이 아니다 :

그래서 구조입니다 끈. 내가 그것을 이진 (늦게 용어로 변환) 변환하려고하지만 성공이 없습니다.

나는 BIF list_to_binary을 사용하려고 시도했다. (목록이 아니기 때문에 작동하지 않을 것이다.) 이미 바이너리이다. 정수 목록으로 변환하고 접어서 변환하려고 시도했지만 여전히 작동하지 않습니다.

나는 뭔가를 놓치고 있다고 생각한다. (나는 Erlang에서 초보자 다.) 조언이 있습니까?

답변

2

당신은 예를 들어,이 형식의 문자열에 관심있는 바이너리 얻을 경우

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

1

다음은 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, ","))). 
관련 문제