2

数値が LSB から MSB までの 4 バイトで期限切れになっている場合、それを整数に変換するにはどうすればよいですか? 例:

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

しかし、これは明らかに遅いです。もう 1 つの可能性は、2 進数のリストと乗数のリストを取得してから折り畳むことです。

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 に答える