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;