【发布时间】:2015-10-07 02:03:39
【问题描述】:
我正在尝试将位串解码为十进制值。例如,我有这些位串
>。我想将它们转换为十进制值,就像您将四位作为数字 (96(01100000) --> 60( 前四位是 6,接下来的四位是 0) , 64 --> 40 等等。输出将是 604070999。最后的 9:4 表示您认为 4 位来表示。
谁能帮忙做这个函数erlang。
【问题讨论】:
我正在尝试将位串解码为十进制值。例如,我有这些位串
>。我想将它们转换为十进制值,就像您将四位作为数字 (96(01100000) --> 60( 前四位是 6,接下来的四位是 0) , 64 --> 40 等等。输出将是 604070999。最后的 9:4 表示您认为 4 位来表示。
谁能帮忙做这个函数erlang。
【问题讨论】:
如果您有二进制而不是位串(即,没有尾随 9:4 部分),您可以对二进制理解中的每个字节应用十六进制转换,然后将生成的二进制转换为整数:
1> Bin = <<96,64,112,153>>.
<<96,64,112,153>>
2> binary_to_integer(<< <<(integer_to_binary(B,16))/binary>> || <<B:8>> <= Bin >>).
60407099
这同样适用于您的位串,一次取 4 位,而不是理解中的 8 位:
3> Bits = <<96,64,112,153,9:4>>.
<<96,64,112,153,9:4>>
4> binary_to_integer(<< <<(integer_to_binary(B,16))/binary>> || <<B:4>> <= Bits >>).
604070999
但正如@Hynek-Pichi-Vychodil 在 cmets 中指出的那样,对于位串,您根本不需要 integer_to_binary/2 调用,而是可以通过添加 @987654325 将每个 4 位数字转换为其对应的字符@,字符0的文字:
5> binary_to_integer(<< <<($0+B)>> || <<B:4>> <= Bits >>).
604070999
【讨论】:
binary_to_integer/1,则没有理由使用integer_to_binary(B, 16)。 binary_to_integer(<< <<($0+B)>> || <<B:4>> <= Bin >>) 就足够了。
<<B:8>> 而不是<<B:4>>,在这种情况下需要integer_to_binary/2。如果您愿意,我会很乐意编辑和扩展答案。