如果一个数字是 4 个字节,从 LSB 到 MSB,如何将其转换为整数?例子:
<<77,0,0,0>> shall give 77
但
<<0,1,0,0>> shall give 256
Let S = <<0,1,0,0>>,
<<L1,L2,L3,L4>> = S,
L = L1*1 + L2*256 + L3*65536 + L4*16777216,
但它并不优雅......
如果一个数字是 4 个字节,从 LSB 到 MSB,如何将其转换为整数?例子:
<<77,0,0,0>> shall give 77
但
<<0,1,0,0>> shall give 256
Let S = <<0,1,0,0>>,
<<L1,L2,L3,L4>> = S,
L = L1*1 + L2*256 + L3*65536 + L4*16777216,
但它并不优雅......
Erlang 中的位语法以非常直接的方式做到了这一点:
<<A:32/little>> = <<0,1,0,0>>,
A.
% A = 256
或作为一个函数:
decode(<<Int:32/little>>) -> Int.
% decode(<<0,1,0,0>>) =:= 256.
编辑(这是正确的答案,很抱歉发现它太晚了......)
> binary:decode_unsigned(<<0,1,0,0>>,little).
256
更简单的方法是:
decode_my_binary( <<A,B,C,D>> ) ->
A + B*256 + C*65536 + D*16777216.
编辑:
根据您的编辑,如果您发现这不是很优雅,您可以尝试其他方法。我仍然认为以上是正确的做法。您可以编写一个递归函数(未经测试,但您明白了):
decode( B ) -> decode(binary_to_list(B), 0, 1).
decode( [], R, _ ) -> R;
decode( [H|T], R, F) ->
decode(T, R + H*F, F*256).
但这显然更慢。另一种可能性是获得二进制数字列表和乘数列表,然后将其折叠:
lists:sum(lists:zipwith( fun(X,Y) -> X*Y end,
binary_to_list(B), [ math:pow(256,X) || X <- [0,1,2,3] ])).
或者,如果您想要可变位数:
fun(Digits) ->
lists:sum(lists:zipwith( fun(X,Y) -> X*Y end,
binary_to_list(B), [ math:pow(256,X) || X <- lists:seq(0,Digits-1])).
在哪里Digits
告诉你数字。