¿Cuál es la diferencia entre un Binario y una Bitstring en Erlang?
!= erlang (2)
La diferencia entre un binario y una cadena de bits es que la longitud de un binario es uniformemente divisible por 8, es decir, no contiene bytes "parciales"; una cadena de bits no tiene tal restricción.
Esta diferencia no es tu problema aquí.
El problema al que se enfrenta es que su sintaxis es incorrecta. Si desea extraer los primeros 32 bits del binario, debe escribir una declaración de coincidencia completa, algo como esto:
<<B1:32, _/binary>> = B.
Tenga en cuenta que /binary
es importante, ya que coincidirá con el remanente del binario, independientemente de su longitud. Si se omite, la longitud coincidente se establece de manera predeterminada en 8 (es decir, un byte).
Puede leer más sobre los binarios y trabajar con ellos en la sección del Manual de Referencia de Erlang sobre sintaxis de bits .
EDITAR
Para su comentario, <<A:32>>
no es solo para enteros, es para valores . Según el enlace que proporcioné, la sintaxis de bit le permite especificar muchos aspectos de la coincidencia binaria, incluidos los tipos de datos de variables vinculadas, mientras que el tipo predeterminado es integer
, también puede decir float
o binary
(entre otros). La parte :32
indica que se requieren 32 bits para una coincidencia, que puede o no ser significativa según su tipo de datos, pero eso no significa que solo sea válida para enteros. Podría, por ejemplo, decir <<Bits:10/bitstring>>
para describir una cadena de bits de 10 bits. ¡Espero que ayude!
En el shell de Erlang, puedo hacer lo siguiente:
A = 300.
300
<<A:32>>.
<<0, 0, 1, 44>>
Pero cuando intento lo siguiente:
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
En el primer caso, tomo un entero y uso la sintaxis de bitstring para ponerlo en un campo de 32 bits. Eso funciona como se esperaba En el segundo caso, estoy usando el term_to_binary
BIF para convertir la tupla en un binario, desde el cual intento descomprimir ciertos bits usando la sintaxis de bitstring. ¿Por qué funciona el primer ejemplo, pero el segundo ejemplo falla? Parece que ambos están haciendo cosas muy similares.
La sintaxis <<A:32>>
construye un binario. Para deconstruir un binario, debe usarlo como un patrón, en lugar de usarlo como una expresión.
A = 300.
% Converts a number to a binary.
B = <<A:32>>.
% Converts a binary to a number.
<<A:32>> = B.