将8位数组分配给8字节数组的元素

时间:2015-08-03 17:18:44

标签: c arrays bytearray stm32

我有数组:TxMessage.Data[8],这个数组的每个元素都是1个字节。因此TxMessage.Data数组的长度总计为8Byte。我有另一个数组:ActiveBits[8]有8位的lentgh。 ActiveBits[i]的每个元素都是1位,只能是01

所以我想将ActiveBits[0 to 7]数组元素分配给TxMessage.Data[1]。我该怎么做?

2 个答案:

答案 0 :(得分:2)

我假设你有一个8位数组,因为在标准方式C 中不可能。但是,从C99开始,你可能会:

_Bool ActiveBits[8];  // bool if you use stdbool.h

其中每个值都是布尔值。为此,您可以简单地:

#include <stdint.h>

uint8_t data = 0;
for ( size_t i = 0 ; i < 8 ; i++ ) {
    data <<= 1;
    data |= ActiveBits[i];
}
TxMessage.Data[1] = data;

这将打包大端(MSB优先)。你应该明确这是否是你真正想要的。但是,循环可以很容易地改为小端。

这与C中一样,_Bool是一个整数类型,其值仅为0 / 1_True / _False)。但是,_Bool仍然不一定是一位。这取决于ABI / PCS(如果未指定,则取决于编译器/工具链)。例如,ARM AAPCS使用uint8_t。

如果那不是_Bool数组,而是任何其他整数类型,请将该行更改为:

    data |= !!barray[i];

这将首先否定(布尔值)值:0变为1,其他任何变为0。然后它再次否定,将0更改为1,反之亦然。现代编译器将检测此模式并对其进行优化。当然,您也可以使用:

    data |= barray[i] != 0;

无论你喜欢什么。

答案 1 :(得分:0)

您可以将数组ActiveBits [8]转换为字节并将其存储到TxMessage.Data [1]

unsigned char raw_byte;
for(i=0;i<8;i++)
{
raw_byte |= ActiveBits[i]; 
raw_byte = raw_byte << 1;  // or raw_byte = raw_byte >> 1; depending on how you want your data to be manipulated
}

TxMessage.Data[1] = raw_byte;