[erlang-questions] Binary matching problem

Tomas Stejskal <>
Mon Feb 25 15:23:06 CET 2008


It doesn't really work for me. I have erlang R12B-1 and it seems you've 
tried it out on version R11B5, maybe it's a bug in R12.

/Tom

Bengt Kleberg wrote:
> Greetings,
>
> The example file and code works for me.
>
> Erlang (BEAM) emulator version 5.5.5.5
> 2> id3_v1:read_v1_or_v11_tag("id3_v1.mp3").
> {ok,{"ID3v1",
>      [{title,<<68,117,154,105,232,107,121>>},
>       {artist,<<"Daniel Landa">>},
>       {album,<<"Best Of">>}]}}
>
>
> bengt
>
> On Sat, 2008-02-23 at 14:58 +0100, Tomas Stejskal wrote:
>> Hello,
>>
>> as a newbie I've played with the module id3_v1.erl from Joe's book and 
>> I've found some strange behavior regarding binary matching. The module's 
>> purpose is reading an id3 version 1 or version 1.1 tag from a mp3 file.
>>
>> Here is modified version of the module:
>>
>> ---
>> -module(id3_v1).
>> -export([read_v1_or_v11_tag/1, read_only_v1_tag/1]).
>> -import(lists, [reverse/1]).
>>
>> read_v1_or_v11_tag(File) ->
>>     read_id3_tag(File, fun parse_v1_or_v11_tag/1).
>>
>> read_only_v1_tag(File) ->
>>     read_id3_tag(File, fun parse_only_v1_tag/1).
>>
>> read_id3_tag(File, Parse) ->
>>     case file:open(File, [read, binary, raw]) of
>>     {ok, S} ->
>>         Size = filelib:file_size(File),
>>         {ok, Bin} = file:pread(S, Size - 128, 128),
>>         Result = Parse(Bin),
>>         file:close(S),
>>         Result;
>>     Error ->
>>         {File, Error}
>>     end.
>>
>> parse_only_v1_tag(<<"TAG", Title:30/binary,
>>            Artist:30/binary, Album:30/binary,
>>            _Year:4/binary, _Comment:30/binary,
>>            _Genre:8>>) ->
>>     {ok,
>>      {"ID3v1",
>>       [{title, trim(Title)},
>>        {artist, trim(Artist)},
>>        {album, trim(Album)}]}};
>> parse_only_v1_tag(_) ->
>>     error.
>>
>> parse_v1_or_v11_tag(<<"TAG", Title:30/binary,
>>        Artist:30/binary, Album:30/binary,
>>        _Year:4/binary, _Comment:28/binary,
>>        0:8, Track:8, _Genre:8>>) ->
>>     {ok,
>>      {"ID3v1.1",
>>       [{track, Track}, {title, trim(Title)},
>>        {artist, trim(Artist)}, {album, trim(Album)}]}};
>> parse_v1_or_v11_tag(<<"TAG", Title:30/binary,
>>           Artist:30/binary, Album:30/binary,
>>           _Year:4/binary, _Comment:30/binary,
>>           _Genre:8>>) ->
>>     {ok,
>>      {"ID3v1",
>>       [{title, trim(Title)},
>>        {artist, trim(Artist)},
>>        {album, trim(Album)}]}};
>> parse_v1_or_v11_tag(_) ->
>>     error.
>>    
>> trim(Bin) ->
>>     list_to_binary(trim_blanks(binary_to_list(Bin))).
>>
>> trim_blanks(L) ->
>>     reverse(skip_blanks_and_zero(reverse(L))).
>>
>> skip_blanks_and_zero([$\s|T]) ->
>>     skip_blanks_and_zero(T);
>> skip_blanks_and_zero([0|T]) ->
>>     skip_blanks_and_zero(T);
>> skip_blanks_and_zero(L) ->
>>     L.
>> ---
>>
>> When I use the function read_v1_or_v11_tag on a mp3 file containing 
>> version 1 tag, it returns an error. However, when the function 
>> read_only_v1_tag is applied on the same file, it reads the tag data 
>> correctly. The only difference between these two functions is that the 
>> former has an extra branch to read version 1.1 tag.
>>
>> Is this a bug or have I missed something?
>>
>> I've included an example file which contains only the id3 v1 tag data 
>> (last 128 bytes of the mp3 file).
>>
>> Thanks in advance
>>
>> /Tom
>>
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://www.erlang.org/mailman/listinfo/erlang-questions
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list