Я использую битовые поля структуры GCC, пытаясь интерпретировать 8-байтовые данные сообщения CAN. Я написал небольшую программу в качестве примера одного из возможных макетов сообщений. Код и комментарии должны описывать мою проблему. Я назначил 8 байтов так, чтобы все 5 сигналов были равны 1. Как показывает вывод на ПК с Intel, это вряд ли так. Все данные CAN, с которыми я имею дело, имеют обратный порядок байтов, и тот факт, что они почти никогда не упаковываются в 8-битное выравнивание, делает htonl() и его друзей бесполезными в этом случае. Кто-нибудь знает решение?
#include <stdio.h>
#include <netinet/in.h>
typedef union
{
unsigned char data[8];
struct {
unsigned int signal1 : 32;
unsigned int signal2 : 6;
unsigned int signal3 : 16;
unsigned int signal4 : 8;
unsigned int signal5 : 2;
} __attribute__((__packed__));
} _message1;
int main()
{
_message1 message1;
unsigned char incoming_data[8]; //This is how this message would come in from a CAN bus for all signals == 1
incoming_data[0] = 0x00;
incoming_data[1] = 0x00;
incoming_data[2] = 0x00;
incoming_data[3] = 0x01; //bit 1 of signal 1
incoming_data[4] = 0x04; //bit 1 of signal 2
incoming_data[5] = 0x00;
incoming_data[6] = 0x04; //bit 1 of signal 3
incoming_data[7] = 0x05; //bit 1 of signal 4 and signal 5
for(int i = 0; i < 8; ++i){
message1.data[i] = incoming_data[i];
}
printf("signal1 = %x\n", message1.signal1);
printf("signal2 = %x\n", message1.signal2);
printf("signal3 = %x\n", message1.signal3);
printf("signal4 = %x\n", message1.signal4);
printf("signal5 = %x\n", message1.signal5);
}