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

Assign a 8 Bit Array to an element of 8 Byte Array

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

所以我想将 ActiveBits[0 to 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; 

我假设您没有 有一个 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;

这将打包位 big endian(MSB 在前)。你应该明确这是否是你真正想要的。但是,循环可以很容易地更改为小端。

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

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

    data |= !!barray[i];

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

    data |= barray[i] != 0;

随心所欲。