我获得了像<<"0421">>
这样的二进制值和0x0421
的十六进制表示。
我必须得到这个十六进制值的位值。
在2&#39;基础表示中,这是0000 0100 0010 0001
。
所以我需要在Erlang中获取这个十六进制的每一位。
如果我使用list_to_integer(binary_to_list())
,我会得到421整数。
请帮我先将这个二进制文件转换为十六进制,然后获取那些十六进制的位值。
答案 0 :(得分:2)
binary_to_integer/2
接受一个基数作为第二个参数。您可以将16
传递给它以将十六进制二进制转换为整数:
1> binary_to_integer(<<"0421">>, 16).
1057
2> 16#0421.
1057
编辑:您可以使用模式匹配将16位中的每一位提取为16个变量:
1> Integer = binary_to_integer(<<"0421">>, 16).
1057
2> <<B0:1, B1:1, B2:1, B3:1, B4:1, B5:1, B6:1, B7:1, B8:1, B9:1, B10:1, B11:1, B12:1, B13:1, B14:1, B15:1>> = <<Integer:16>>.
<<4,33>>
3> {B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15}.
{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}
B0
现在为0
,B5
为1
等。
答案 1 :(得分:0)
根据Dogbert的提议,您不会对预期的结果格式说太多,这是一个更自动化的解决方案。
1> HexToBin = fun(D) ->
1> S = size(D) * 4,
1> I = binary_to_integer(D,16),
1> << << X >> || <<X:1>> <= << I:S >> >>
1> end.
#Fun<erl_eval.6.52032458>
2> HexToBin(<<"0421">>).
<<0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1>>
3> rp(HexToBin(<<"00123456789abcdef0421">>)).
<<0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,0,0,1,0,1,
0,1,1,0,0,1,1,1,1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,
1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1>>
ok
4>
答案 2 :(得分:0)
1> integer_to_list(binary_to_integer(<<"0421">>, 16),2).
"10000100001"
请参阅相同核心erlang
模块的文档。特别要注意integer_to_list/2
的第二个参数。
答案 3 :(得分:-1)
Dogbert的解决方案可能会对大整数有点乏味。
bits(HexBin) ->
bits(
binary:encode_unsigned(
binary_to_integer(HexBin, 16)
),
[]
).
bits(<<Bit:1, Rest/bitstring>>, Acc) ->
bits(Rest, [Bit|Acc]);
bits(<<>>, Acc) ->
list_to_tuple(lists:reverse(Acc)).
在shell中:
6> c(my).
{ok,my}
7> my:bits(<<"0421">>).
{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}
8> LongResult = my:bits(<<"FFFFFFFFFFFFFF0421">>).
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...}
9> io:format("~p~n", [LongResult]).
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}
ok