【发布时间】:2012-10-02 22:13:47
【问题描述】:
%问题
假设我有一个二进制数:
1011011101111011111
每个数字都是一位。
我希望能够将其转换为:
[1、11、111、1111、11111]
...最终进入:
[1、2、3、4、5]
%我试过了
我尝试了 binary:split,但数据总是以比特块编码。我只想处理原始数据(如果可能的话)。
%我要完成的工作
我正在为路由协议设计一个标头。我希望标头包含数据包已经访问过的地址列表。我想如果我给标题本身一个由零分隔的连续的标题组成的标题,我就不必对标题的总长度施加任何限制。标头的标头将通过两个连续的零与标头本身分开。所以如果我有一个有效载荷,上面写着:
>
并且数据已被 alice、bob 和 carl 访问过,则标题为:
>
并且标头的标头是:
(8*5 个) 0 (8*3 个) 0 (8*4 个) 00
假设我们对标头使用了一些 8 位编码。
然后实际的数据包将显示为:
(8*5 个) 0 (8*3 个) 0 (8*4 个) 00 > >
为了破译报头,我将首先找到 00 的第一个实例,然后将 00 之前的所有内容拆分为每个 0。然后我会将结果列表转换为一个列表,其中包含数据包经过的每个地址中的位数到。然后我终于可以从标头中读取地址并检索有效负载。
【问题讨论】:
-
两个while循环可以做到这一点。外层循环直到数字变为 0,内层循环在 LSB 为 1 时循环,并计算在到达 0 之前发生的次数。
-
我很确定 Erlang 没有 for/while 循环。此外,我不知道如何在 Erlang 中实际读取各个位。
-
哎呀——我对erlang一无所知——也许我的评论没有帮助。这就是我在 C 等低级语言中的做法。
-
Erlang 有递归,所以它可以循环,它有除法和模数,所以你可以读取 LSB 并进行位移。
-
不应该是
(8*5 ones) 0 (8*3 ones) 0 (8*4 ones)吗?