合成されたサンプル問題を次に示します。解析したいバイナリ ファイル ( test.txt ) があります。<<$a, $b, $c>>
ファイル内のすべてのバイナリ パターンを検索したい。
「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.
サンプル プログラム ( 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.
それを実行します:
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
上記のコードはあまり効率的ではなく (スキャン プロセスは一度に 1 バイトずつシフトします)、シーケンシャルです (コンピューターのすべての「コア」を利用していない) ことに注意してください。これは、開始することのみを目的としています。