数値が 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,
でもエレガントじゃない…
数値が 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,
でもエレガントじゃない…
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).
しかし、これは明らかに遅いです。もう 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
桁数を教えてください。