Пустой двоичный список с сопоставлением шаблонов

#erlang

#erlang

Вопрос:

Я пытаюсь проанализировать двоичный файл, и когда дело доходит до возврата чисел, упакованных в конце строки в 16 бит, я надеюсь, что это сработает:

 foo(Bin, Bits) when is_binary(Bin) ->
    <<A, B, C, D, _Rest>> = Bin,
    (bar(<<A, B>>, Bits) =/= 0) and (bar(<<C, D>>, Bits) =/= 0).

bar(<<N:16/little-unsigned-integer>>, Bits) ->
    binary:at(Bits, N).
  

К сожалению, сопоставитель не работает, когда Bin составляет 4 байта или меньше. Есть ли лучший способ сделать так, чтобы остальные файлы были пустыми? Если бы я мог избежать тестирования двоичной длины в вызывающем, тем лучше.

Комментарии:

1. Что будет соответствовать C или D , если длина входных данных составляет менее 4 байт?

Ответ №1:

Вы могли бы сделать что-то вроде:

 foo(<<A:16/little-unsigned-integer,B:16/little-unsigned-integer,_Rest/binary>>, Bits) ->
    (binary:at(Bits, A) =/= 0) and (binary:at(Bits, B) =/= 0).
  

Это не будет работать с двоичным файлом длиной менее 4 байт. Что должно произойти в этом случае?

Примечание: binary:at/2 работает с двоичными файлами, а не с битовыми строками, и смещение указано в байтах.

Комментарии:

1. Спасибо за ваш ответ. Это то, что мне нужно, чтобы я отклеился. Просмотр двоичных файлов в Erlang очень полезен. Функция никогда не будет вызываться с объемом менее 4 байт, так что это работает нормально.