2011-05-26 28 views
5

我有一個二進制< <「a,b,c」>>我想從這個二進制文件中提取信息。Erlang howto從這個二進制列表<<"a,b,c">>

所以我想有像A = a,B = b等等。 我需要一個通用的方法,因爲二進制字符串總是改變。 所以它可能是< < 「AAA」, 「BBB」, 「CCC」 >> ...

我試圖生成一個列表

二郎:binary_to_list(< < 「A」, 「B」 ,「c」>>)

但我得到字符串作爲結果。

「abc」

謝謝。

回答

11

您確實使用了正確的方法。

binary_to_list(Binary) -> [char()]

返回其對應的二進制字節的整數列表。

Erlang沒有字符串類型:http://www.erlang.org/doc/reference_manual/data_types.html#id63119。如果所有元素都在可打印的ASCII範圍內,則控制檯僅在字符串表示中顯示列表作爲禮貌。

您應該閱讀Erlang的"Bit Syntax Expressions"文檔以瞭解如何使用二進制文件。

如果您不需要列表表示,請不要將整個二進制文件轉換爲列表!

提取前三個字節你可以使用

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

如果你想遍歷二進制數據,你可以使用二進制的理解。

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

模式匹配是可能的,太:

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

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

即使是在一次讀取一個UTF-8字符。因此,要convert a binary UTF-8 string成Erlang的格式「的碼點名單」,你可以使用:

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">>, ""). 

(注意,`<<"aaa","bbb","ccc">> = <<"aaabbbccc">>不實際使用剪斷了最後的代碼,但鏈接的方法)

+0

感謝您時間,問題是我需要二進制的列表表示。我想從一個二進制文件構建這樣的結構[{user,andreas},{adress,germany}]。我永遠不知道有多少字節ID必須提取獲取第一個Term {user,adreas}。我以爲我可以使用二進制<< user,andreas,adress,germany >>並將此二進制文件轉換爲列表,以便我可以從二進制文件中獲取信息。 – Andreas 2011-05-26 20:07:19

+1

你想在給定的令牌上分割二進制數據嗎? HTTP://計算器。com/questions/428124/how-can-i-split-a-binary-in-erlang – kay 2011-05-26 20:40:43

+0

我在[link](http://stackoverflow.com/questions/428124/how-can-i-split -a-binary-in-erlang),它的工作原理,但它不是一個優雅的方式來解決我的問題,因爲我將不得不在我的應用程序中使用一個特殊的令牌。 – Andreas 2011-05-26 21:08:30

相關問題