C:将位位置转换为十进制

时间:2014-10-09 14:48:36

标签: c

场景:

[节点A]< -------- Rf-interface ------> [节点B]

问题:

节点A向节点B发送一个6字节长的有效载荷。在该有效载荷中,存在关于可用时隙的一些信息,共有6个字节* 8位= 48个插槽。每个插槽可以是ON 1或OFF 0.

例如,这些插槽号0,2,5,7都是ON。有效载荷的位表示将是: 10100101000000000 ....直到第48位。
然后,这些信息通过RF接口发送到有效载荷中的节点B.

在Node B,我需要将每个位表示的位置转换为数组中的十进制表示(对于某些gui表示)。 回到例子:
我需要将有效负载转换为以下位:10100101000000000 ...转换为数组中的活动插槽表示:例如

myArray[0] = 1;
myArray[1] = 0;
myArray[2] = 1;
myArray[3] = 0;
myArray[4] = 0;
myArray[5] = 1;
         .
         .
myArray[48] = x;

我的位掩码并不好,所以任何帮助都值得赞赏 谢谢大家的帮助!

3 个答案:

答案 0 :(得分:1)

这个怎么样?:

    char *bitsToArray(char *data, int length)
    {
        char *rv = malloc(8*length);
        int i = 0;
        for(;i < length; ++i)
        {
            int j = 0;
            for(; j < 8; ++j)
            {
                rv[i*8+j] = (data[i]>>j)&1;
            }

        }
        return rv;
    }

它首先存储最低有效位。如果您希望以相反的位顺序工作,可以将行rv[i*8+j] = (data[i]>>j)&1;更改为rv[i*8+j] = (data[i]>>(7-j))&1;

答案 1 :(得分:0)

for (int i = 0; i < buffer_size; i++) {
    for (int j = 7; j >= 0; j--) { // most significant bit first
        myArray[8 * i + j] = buffer[i] >> j & 1;
    }
}

答案 2 :(得分:0)

根据您的示例,我假设位图,给定的6字节数组是:

unsigned char bitmap[6] = {0xa5, 0x00, 0x00, 0x00, 0x00, 0x00};

结果的目的是:

int myArray[48];

我倾向于从后到前遍历myArray,并根据位图中最低位的测试分配每个值,然后在每次循环迭代时右移。

int bmi = 5;    // set bitmap index to end
int mai = 47;   // set myArray index to end
int i = 0;

while (mai >= 0) {
    for (i = 0; i < 8; i++) {
        myArray[mai] = bitmap[bmi] & 0x01;
        bitmap[bmi] >>= 1;
        --mai;
    }
    --bmi;
}
for (mai = 0; mai < 48; mai++) printf("%d", myArray[mai]);
printf("\n");