От вашего комментария к другому ответу вы хотите, чтобы все, что было введено в word
член union
, отображалось в fields.bytesN
члене.Чтобы достичь этого, вы должны либо иметь какой-то процесс предварительной сборки, который правильно распределяет битовые поля field
после обнаружения машинного порядка байтов, либо создать 2 структуры, одну для старшего и другого для младшего.
typedef union Status
{
struct fieldsBE
{
uint32_t byteA : 1; // <31>
uint32_t blank : 23; // <30:8>
uint32_t bytesN : 8; // <7:0>
} fieldsBE;
struct fieldsLE
{
uint32_t bytesN : 8; // <7:0>
uint32_t blank : 23; // <30:8>
uint32_t byteA : 1; // <31>
} fieldsLE;
uint32_t word;
};
int main()
{
bool isBigEndian = DetectEndianness(); // returns true if big endian
Status status;
status.word = 40;
if( isBigEndian ) {
uint8_t bytesN = status.fieldsBE.bytesN;
} else {
uint8_t bytesN = status.fieldsLE.bytesN;
}
}
Конечно, если вы хотите поддерживать в своем порту только порядок байтов, используйте макет fieldsLE
вместо показанного вами оригинального макета.