Преобразование структуры в байты и обратно в структуру

Я сейчас работаю с Arduino Unos, 9DOFs и XBees, и я пытался создать структуру, которая могла бы быть отправлена ​​через последовательный, побайтный, а затем преобразована в структуру.

Пока у меня есть следующий код:

struct AMG_ANGLES {
float yaw;
float pitch;
float roll;
};

int main() {
AMG_ANGLES struct_data;

struct_data.yaw = 87.96;
struct_data.pitch = -114.58;
struct_data.roll = 100.50;

char* data = new char[sizeof(struct_data)];

for(unsigned int i = 0; i<sizeof(struct_data); i++){
// cout << (char*)(&struct_data+i) << endl;
data[i] = (char*)(&struct_data+i); //Store the bytes of the struct to an array.
}

AMG_ANGLES* tmp = (AMG_ANGLES*)data; //Re-make the struct
cout << tmp.yaw; //Display the yaw to see if it's correct.
}

Источник: http://codepad.org/xMgxGY9Q

Этот код, кажется, не работает, и я не уверен, что я делаю неправильно.

Как мне это решить?

20

Решение

Кажется, я решил мою проблему с помощью следующего кода.

struct AMG_ANGLES {
float yaw;
float pitch;
float roll;
};

int main() {
AMG_ANGLES struct_data;

struct_data.yaw = 87.96;
struct_data.pitch = -114.58;
struct_data.roll = 100.50;

//Sending Side
char b[sizeof(struct_data)];
memcpy(b, &struct_data, sizeof(struct_data));

//Receiving Side
AMG_ANGLES tmp; //Re-make the struct
memcpy(&tmp, b, sizeof(tmp));
cout << tmp.yaw; //Display the yaw to see if it's correct
}

ПРЕДУПРЕЖДЕНИЕ. Этот код будет работать только в том случае, если для отправки и получения используются одинаковые обратный порядок байт архитектура.

28

Другие решения

Вы делаете вещи в неправильном порядке, выражение

&struct_data+i

принимает адрес struct_data и увеличивает его на i раз размер структуры.

Попробуйте это вместо этого:

*((char *) &struct_data + i)

Это преобразует адрес struct_data к char * а также затем добавляет индекс, а затем использует оператор разыменования (унарный *), чтобы получить «символ» по этому адресу.

6

Всегда используйте структуры данных в полной мере ..

union AMG_ANGLES {
struct {
float yaw;
float pitch;
float roll;
}data;
char  size8[3*8];
int   size32[3*4];
float size64[3*1];
};
5

for(unsigned int i = 0; i<sizeof(struct_data); i++){
// +i has to be outside of the parentheses in order to increment the address
// by the size of a char. Otherwise you would increment by the size of
// struct_data. You also have to dereference the whole thing, or you will
// assign an address to data[i]
data[i] = *((char*)(&struct_data) + i);
}

AMG_ANGLES* tmp = (AMG_ANGLES*)data; //Re-Make the struct
//tmp is a pointer so you have to use -> which is shorthand for (*tmp).yaw
cout << tmp->yaw;
}
1
По вопросам рекламы [email protected]