2015-02-13 2 views
2

Я делаю это:Binary шаблон в список

<<a :: big-size(16), b :: big-size(16), c :: big-size(16)>> = <<0, 1, 0, 2, 0, 3>> 

И тогда результат будет:

a = 1 
b = 2 
c = 3 

Но то, что я на самом деле нужно:

a = [1, 2, 3] 

Есть ли способ для достижения этого?

ответ

5

Если я прочитал Ваш комментарий в ответ на greggreg правильно, это это один из способов сделать это:

<< size::8, rest::binary>> = <<3,0,25,1,1,2,1,6,4,3>> 
<< data::size(size)-unit(16)-binary, rest::binary>> = rest 
elements = for << <<element::16>> <- data>>, do: element 

# At this point, elements is the list of n 16 bit integers 
# (n being the first byte), and rest is the rest of the binary 
5

Не соответствует шаблону напрямую. Вы можете соответствовать только всей структуре или подструктуре. Вы не можете принуждать одну структуру к другой.

еще одна строка кода получает вас там, хотя:

<<a :: 16, b :: 16, c :: 16>> = <<0, 1, 0, 2, 0, 3>> 
a = [a, b, c] # a equals [1, 2, 3] 

Или вы могли бы написать понимание, чтобы сделать это:

a = for <<b :: 16 <- <<0, 1, 0, 2, 0, 3>> >>, do: b 
+0

В принципе, мне нужно сопоставить двоичный код в список двухбайтовых целых чисел. Но размер списка появляется как первый байт этого двоичного файла, поэтому мне нужно сделать это несколько более динамичным. – bobby

+0

Ну, это совсем другой вопрос, но я отдам его. – greggreg

+0

Нм, ответ @ sasajuric делает трюк! – greggreg