将 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位,只能是0
或1
。
所以我想将 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;
随心所欲。
我有数组:TxMessage.Data[8]
,这个数组的每个元素都是 1 个字节。所以 TxMessage.Data
数组的长度总共是 8Byte。我有另一个数组:ActiveBits[8]
,长度为 8 位。 ActiveBits[i]
的每个元素为1位,只能是0
或1
。
所以我想将 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;
随心所欲。