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

C 将8位数组分配给8字节数组的元素,c,arrays,bytearray,stm32,C,Arrays,Bytearray,Stm32,我有一个数组:TxMessage.Data[8],这个数组的每个元素是1个字节。因此TxMessage.Data数组的长度总计为8字节。我还有另一个数组:ActiveBits[8],它的lentgh为8位。ActiveBits[i]的每个元素是1位,只能是0或1 因此,我想将ActiveBits[0到7]数组元素分配给TxMessage.Data[1]。我该怎么做呢?您可以将数组ActiveBits[8]设置为一个字节,并将其存储到TxMessage.Data[1] unsigned char

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


因此,我想将
ActiveBits[0到7]
数组元素分配给
TxMessage.Data[1]
。我该怎么做呢?

您可以将数组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; 
无符号字符原始字节;
对于(i=0;i 1;取决于您希望如何操纵数据
}
TxMessage.Data[1]=原始字节;

我假设您没有一个8位的数组,因为在C中,这是不可能以标准方式实现的

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

    data |= barray[i] != 0;

你喜欢什么都行。

如何创建一个8位数组?
ActiveBits[0到8]
。off by one我刚刚创建了一个像;uint8\u t ActiveBits[8];并将其元素分配给0或1是,但你将其索引为
[0..7]
而不是
[0..8]
@abdullahcinar:是的,我在编辑时注意到了。请重新阅读并删除否决票(如果你这样做了)。我不能使用
uint8\u t raw\u byte
?它就是这样工作的。@abdullahcinar:看我的答案,那实际上是首选的类型。但是,请注意,正如我在回答中所说的,这会将位压缩为大端(较低的索引变为较高的位号)。您必须确保接收器将正确解释此内容!这是序列化数据结构时的一个主要故障。当然,这是不正确的,因为
原始字节
将始终清除其LSBit。建议在
|=未初始化
原始字节
之前进行移位。此代码有问题,请尝试此操作,然后重试一个转移问题是的,你也可以使用ui8\u t,我以为你的图书馆没有UIT8\u t
    data |= barray[i] != 0;