Đây là một bài toán mẫu tổng hợp: Tôi có một tập tin nhị phân (test.txt) mà tôi muốn phân tích. Tôi muốn tìm tất cả các mẫu nhị phân của <<$a, $b, $c>>
trong tệp.
Nội dung của "test.txt":
I arbitrarily decide to choose the string "abc" as my target string for my test. I want to find all the abc's in my testing file.
Một chương trình mẫu (lab.erl):
-module(lab).
-compile(export_all).
find(BinPattern, InputFile) ->
BinPatternLength = length(binary_to_list(BinPattern)),
{ok, S} = file:open(InputFile, [read, binary, raw]),
loop(S, BinPattern, 0, BinPatternLength, 0),
file:close(S),
io:format("Done!~n", []).
loop(S, BinPattern, StartPos, Length, Acc) ->
case file:pread(S, StartPos, Length) of
{ok, Bin} ->
case Bin of
BinPattern ->
io:format("Found one at position: ~p.~n", [StartPos]),
loop(S, BinPattern, StartPos + 1, Length, Acc + 1);
_ ->
loop(S, BinPattern, StartPos + 1, Length, Acc)
end;
eof ->
io:format("I've proudly found ~p matches:)~n", [Acc])
end.
Run nó:
1> c(lab).
{ok,lab}
2> lab:find(<<"abc">>, "./test.txt").
Found one at position: 43.
Found one at position: 103.
I've proudly found 2 matches:)
Done!
ok
Lưu ý rằng đoạn mã trên không hiệu quả lắm (quá trình quét thay đổi một byte tại một thời điểm) và nó là tuần tự (không sử dụng tất cả các "lõi" trên máy tính của bạn). Nó có nghĩa là chỉ để giúp bạn bắt đầu.
Nó cũng sẽ giúp một ví dụ về nhị phân bạn đang cố gắng phân tích cú pháp và kết quả cuối cùng sẽ trông như thế nào. – Lukas