我有数组:TxMessage.Data[8]
,这个数组的每个元素都是1个字节。因此TxMessage.Data
数组的长度总计为8Byte。我有另一个数组:ActiveBits[8]
有8位的lentgh。 ActiveBits[i]
的每个元素都是1位,只能是0
或1
。
所以我想将ActiveBits[0 to 7]
数组元素分配给TxMessage.Data[1]
。我该怎么做?
答案 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;