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

6

В оболочке 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

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

Ваш Ответ

2   ответа
12

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

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

Так это<<A:32>> синтаксис действителен только для целых чисел, тогда? quanticle
1

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

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

Похожие вопросы