Aquí es un problema de la muestra sintetizada: Tengo un archivo binario (test.txt) que quiera analizar. Quiero encontrar todos los patrones binarios de <<$a, $b, $c>>
en el archivo.
El contenido de "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.
Un programa de ejemplo (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 que:
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
Tenga en cuenta que el código anterior no es muy eficiente (el proceso de escaneo se desplaza un byte a la vez) y es secuencial (no utiliza todos los "núcleos" en su computadora). Está destinado solo para que comiences.
También ayudaría con un ejemplo del binario que está tratando de analizar y cómo debería ser el resultado final. – Lukas