|
|
  |
Преобразование структуры в массив и обратно, как это сделать? |
|
|
|
Dec 10 2011, 07:58
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Есть функция для подсчета CRC. Она работает с массивом. Мне же нужно чтобы она считала CRC структуры. Правильней будет сказать, что в пакете 16 байт, последний из них и есть CRC. Его нужно считать перед отправкой пакета и проверять при получении. Функция: Код unsigned char Crc8(unsigned char *buf, unsigned char len) { unsigned char crc = 0xFF; while (len--) crc = Crc8Table[crc ^ *buf++]; return crc; } Структура: Код struct dataexchange_t { uchar b1; uchar b2; uchar b3; uchar b4; uchar b5; uchar b6; uchar b7; uchar b8; uchar b9; uchar b10; uchar b11; uchar b12; uchar b13; uchar b14; uchar b15; uchar b16; }; Как проще преобразовать структуру в массив (с ним удобней) ?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Dec 10 2011, 10:36
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (smk @ Dec 10 2011, 09:58)  Есть функция для подсчета CRC. Она работает с массивом. Мне же нужно чтобы она считала CRC структуры. CODE unsigned char Crc8(void const *pSrc, unsigned char len) { unsigned char const * buf = (unsigned char const *)pSrc; unsigned char crc = 0xFF; while (len--) crc = Crc8Table[crc ^ *buf++]; return crc; }
uint8_t test (dataexchange_t Test_data) { return Crc8(&Test_data, sizeof(Test_data)); }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 10 2011, 12:01
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(smk @ Dec 10 2011, 15:46)  Есть ли способ написать компактней и красивей вот это: Код buf_rx[0] = pdata.b1; ... buf_rx[15] = pdata.b16; Код memcpy(buf_rx,pdata,sizeof(pdata)); Цитата(smk @ Dec 10 2011, 15:27)  Не совсем понятно. Может проще переписывать одно в другое и обратно? Юнион не тратит процессорное время когда "так" преобразовывает переменные.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Dec 18 2011, 20:39
|
Местный
  
Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795

|
Цитата неприятности из-за паддинга на платформах, где есть выравнивание Это точно, - проходили между писюком и AVRом. На счет Цитата Как проще преобразовать структуру в массив не вижу смысла что-то во что-то преобразовывать. Нужно создать указатель на структуру, например так: unsigned char * pDataArray = (unsigned char*) & mySruct; и использовать для подсчета его так, как еслибы Вы использовали массив.
|
|
|
|
|
Dec 19 2011, 06:19
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (sigmaN @ Dec 19 2011, 04:02)  Но ведь в таком случае всё равно есть риск наткнуться на неприятности из-за паддинга на платформах, где есть выравнивание. Это можно обойти, если вставлять в структуру паддинг руками, исходя из выравнивания по адресам, кратным 4 (как правило этого должно хватить). Но неудобно, конечно, это делать руками, и ошибки будут регулярно возникать.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|