如何将二进制列表转换为char?

时间:2016-10-17 09:07:36

标签: erlang

我想将一个零和一个列表转换为一个字符。 例如:

bitToChar([1,0,0,0,1,0,1]) = $Q

感谢。

4 个答案:

答案 0 :(得分:5)

另一种方法是使用bit string comprehension

X = [1,0,0,0,1,0,1],
<<C:7>> = << <<Bit:1>> || Bit <- lists:reverse(X) >>,
$Q == C.

也就是说,从列表中一次选择一个元素,并将每个元素用作正在构建的二进制文件中的一个位,最后将七位数字提取到变量C中。

答案 1 :(得分:1)

您可以为每个$0添加$0(使其成为包含$1list_to_integer/2 s的字符串),反转列表,并使用基数2 1> list_to_integer(lists:reverse([N + $0 || N <- [1,0,0,0,1,0,1]]), 2) == $Q. true

lists:foldl

您也可以使用list_to_binary。代码稍长但不使用1> element(2, lists:foldl(fun(Digit, {Mul, Acc}) -> {Mul * 2, Acc + Digit * Mul} end, {1, 0}, Xs)) == $Q. true

1 * 1 + 0 * 2 + 0 * 4 + 0 * 8 + 1 * 16 + 0 * 32 + 1 * 64

这基本上等同于:{{1}}。

答案 2 :(得分:1)

$Q = lists:foldr(fun(X,Acc) -> X + (Acc bsl 1) end, 0,[1,0,0,0,1,0,1]).

答案 3 :(得分:0)

由于$Q是整数值,所以您只需使用BitToChar从基于二进制的数字转换为基于十进制的数字。

最简单的转换是:

to_decimal(X) ->
  to_decimal(lists:reverse(X), 1, 0).

% you can validate that if H = 1 then add, if other not but I omitted this validation
to_decimal([H | T], Times, Acc) ->
  to_decimal(T, 2 * Times, H * Times + Acc);

to_decimal([], _Times, Acc) -> Acc.

然后它将返回整数。 在你的情况下:

> $Q = 81. 
81

> $Q == 81.
true