#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 байт, так что это работает нормально.