2

如果一个数字是 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

2 回答 2

9

Erlang 中的位语法以非常直接的方式做到了这一点:

<<A:32/little>> = <<0,1,0,0>>,
A.
% A = 256

或作为一个函数:

decode(<<Int:32/little>>) -> Int.

% decode(<<0,1,0,0>>) =:= 256.
于 2012-06-16T06:58:43.050 回答
3

编辑(这是正确的答案,很抱歉发现它太晚了......)

> 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告诉你数字。

于 2012-06-15T23:16:28.173 回答