2011-05-26 10 views
5

Tengo un < binario < "a, b, c" >> y me gustaría extraer la información de este binario.Erlang cómo hacer una lista de este binario <<"a,b,c">>

Entonces me gustaría tener algo como A = a, B = b y así sucesivamente. Necesito un enfoque general sobre esto porque la cadena binaria siempre cambia. lo que podría ser < < "AAA", "bbb", "CCC" >> ...

Me trataron de generar una lista

Erlang: binary_to_list (< < "a", "b" , "c" >>)

pero recibo cadena como resultado.

"abc"

Gracias.

Respuesta

11

Usaste el método correcto.

binary_to_list(Binary) -> [char()]

devuelve una lista de números enteros que corresponden a los bytes de binario.

No hay ningún tipo de cadena en Erlang: http://www.erlang.org/doc/reference_manual/data_types.html#id63119. La consola solo muestra las listas en representación de cadenas como cortesía, si todos los elementos están en el rango ASCII imprimible.

Debe leer la documentación de Erlang "Bit Syntax Expressions" para comprender cómo trabajar con los binarios.

¡No convierta todo el binario en una lista si no lo necesita en la representación de la lista!

para extraer los tres primeros bytes se podría utilizar

<<A, B, C, Rest/binary>> = <<"aaa","bbb","ccc">>. 

Si desea iterar sobre los datos binarios, puede utilizar la comprensión binario.

<< <<(F(X))>> || <<X>> <= <<"aaa","bbb","ccc">> >>. 

Coincidencia de patrones es posible, también:

test(<<A, Tail/binary>>, Accu) -> test(Tail, Accu+A); 
test(_, Accu) -> Accu. 

882 = test(<<"aaa","bbb","ccc">>, 0). 

Incluso para la lectura de un carácter UTF-8 a la vez. Así que para convert a binary UTF-8 string en "lista de puntos de código" formato de Erlang, se puede utilizar:

test(<<A/utf8, Tail/binary>>, Accu) -> test(Tail, [A|Accu]); 
test(_, Accu) -> lists:reverse(Accu). 

[97,97,97,600,99,99,99] = test(<<"aaa", 16#0258/utf8, "ccc">>, ""). 

(.. Tenga en cuenta que `<<"aaa","bbb","ccc">> = <<"aaabbbccc">> no utilizan el último código cortado con tijeras pero el método ligado)

+0

Gracias por su tiempo, el problema es que necesito una lista de binarios. Me gustaría construir algo así como esta estructura [{user, andreas}, {adress, germany}] desde un binario. Nunca sé cuántos bytes de id tiene que extraer para obtener el primer término {usuario, adreas}. Pensé que podría usar un << usuario, andreas, dirección, Alemania >> binario y convertir este binario en una lista para poder obtener la información de un binario. – Andreas

+1

¿Quieres dividir los datos binarios en un token determinado? http: // stackoverflow.com/questions/428124/how-can-i-split-a-binary-in-erlang – kay

+0

Intenté la solución en [link] (http://stackoverflow.com/questions/428124/how-can-i-split -a-binary-in-erlang) y funciona, pero no es una manera elegante de resolver mi problema porque tendré que prohibir el uso de un token especial en mi aplicación. – Andreas

Cuestiones relacionadas