В чем разница между двоичной и битовой строками в Erlang?

в оболочке Erlang я могу сделать следующее:

A = 300.
    300
<<A:32>>.
    <<0, 0, 1, 44>>

но когда я пытаюсь следующее:

B = term_to_binary({300}).
    <<131,104,1,98,0,0,1,44>>
<<B:32>>
    ** exception error: bad argument
<<B:64>>
    ** exception error: bad argument

в первом случае я беру целое число и использую синтаксис bitstring, чтобы поместить его в 32-битное поле. Это работает, как и ожидалось. Во втором случае, я использую term_to_binary BIF, чтобы превратить Кортеж в двоичный файл, из которого я пытаюсь распаковать определенные биты, используя синтаксис bitstring. Почему первый пример работает, а второй терпит неудачу? Похоже они оба делают очень похожие вещи.

2 ответов


разница между двоичным и битовой строкой заключается в том, что длина двоичного файла равномерно делится на 8, т. е. он не содержит "частичных" байтов; битовая строка не имеет такого ограничения.

эта разница не ваша проблема здесь.

проблема вы столкнулись, что ваш синтаксис неправильный. Если вы хотите извлечь первые 32 бита из двоичного файла, вам нужно написать полный оператор соответствия-что-то вроде этого:

<<B1:32, _/binary>> = B.

обратите внимание, что the /binary важно, так как он будет соответствовать остатку двоичного файла независимо от его длины. Если этот параметр опущен, соответствующая длина по умолчанию равна 8 (т. е. один байт).

вы можете прочитать больше о двоичных файлах и работе с ними в раздел справочного руководства Erlang по синтаксису битов.

редактировать

к вашему комментарию,<<A:32>> не только для целых чисел, это значения. По ссылке, которую я дал, синтаксис bit позволяет указать много аспекты бинарного сопоставления, включая типы данных связанных переменных - в то время как тип по умолчанию integer, вы также можете сказать float или binary (среди прочих). The :32 часть указывает, что для соответствия требуется 32 бита - это может быть или не быть значимым в зависимости от вашего типа данных, но это не означает, что это допустимо только для целых чисел. Вы могли бы, например, сказать <<Bits:10/bitstring>> для описания 10-бит битовая. Надеюсь, это поможет!


на <<A:32>> синтаксис конструкции бинарный. К деконструировать двоичный файл, вам нужно использовать его как шаблон, а не использовать его в качестве выражения.

A = 300.
% Converts a number to a binary.
B = <<A:32>>.
% Converts a binary to a number.
<<A:32>> = B.