реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> [РЕШЕНО] Прочитать структуру по байтам (Си)
Alt.F4
сообщение Jul 14 2013, 12:14
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Здравствуйте.
Подскажите, пожалуйста, возможно ли как-то прочитать структуру по байтам на языке Си?
Т.е. как обычный массив: for(i=0;i!=size;i++) temp=array[i];
Хочу ничего не нарушая засунуть ее по байтам во внешнюю память и таким же образом потом считывать.
Спасибо.

Сообщение отредактировал Alt.F4 - Jul 14 2013, 14:36
Go to the top of the page
 
+Quote Post
Methane
сообщение Jul 14 2013, 12:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(Alt.F4 @ Jul 14 2013, 15:14) *
Здравствуйте.
Подскажите, пожалуйста, возможно ли как-то прочитать структуру по байтам на языке Си?
Т.е. как обычный массив: for(i=0;i!=size;i++) temp=array[i];
Хочу ничего не нарушая засунуть ее по байтам во внешнюю память и таким же образом потом считывать.
Спасибо.

http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%...%D1%8B%D1%85%29
Но можно и указатель на структуру переделать в указатель на char и так передать.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jul 14 2013, 12:33
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Methane, не понятно... А можно пример?
Спасибо.
Код
volatile struct
{
     char    date[size_date];
     char    time[size_time];
}
Buffer[size_buffer];
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 14 2013, 12:39
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alt.F4 @ Jul 14 2013, 15:33) *
А можно пример?
Спасибо.
Код
volatile struct
{
     char    date[size_date];
     char    time[size_time];
}
Buffer[size_buffer];



Код
struct STR
{
     char    date[size_date];
     char    time[size_time];
} S;
uint8_t Buffer[sizeof(STR)];

void StructCopy()
{
    uint8_t * src=(uint8_t *)&S;
    uint8_t * dest=Buffer;
    for (uint32_t i=0; i<sizeof(STR); i++)
        *dest++=*src++;

}

Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 14 2013, 12:57
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(_Артём_ @ Jul 14 2013, 16:39) *
Код
struct STR
{
     char    date[size_date];
     char    time[size_time];
} S;
uint8_t Buffer[sizeof(STR)];

Или так?
Код
void StructCopy()
{
  *(STR *)&Buffer[0] = S; // запись
  S = *(STR *)&Buffer[0]; // чтение
}

Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jul 14 2013, 14:10
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



_Артём_, супер!!!

Подскажите, пожалуйста:
1. Как объявить указатель двухбайтовым, т.к. длина структуры больше 255?
На uint16_t * src=(uint8_t *)&S; компилятор ставит варнинг.
2. Как объявить структуру как внешнюю, типа extern struct?
Спасибо.

Сообщение отредактировал Alt.F4 - Jul 14 2013, 14:12
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 14 2013, 14:25
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alt.F4 @ Jul 14 2013, 17:10) *
Подскажите, пожалуйста:
1. Как объявить указатель двухбайтовым, т.к. длина структуры больше 255?

Размер указателя зависит от архитектуры и компилятора. Если длина данных у вас не вмещается в байт, то используйте такой цикл:

Код
uint8_t * src=(uint8_t *)&S;
    uint8_t * dest=Buffer;
    for (uint16_t i=0; i<sizeof(STR); i++) //  uint16_t - можно копировать до 65535 байт,  uint32_t  - больше 4 млрд. байт
        *dest++=*src++;


Цитата(Alt.F4 @ Jul 14 2013, 17:10) *
На uint16_t * src=(uint8_t *)&S; компилятор ставит варнинг.


И правильно что ругается - приводите не к тому типу, надо к int16_t *.

Код
uint16_t * src=(uint16_t *)&S;


Цитата(Alt.F4 @ Jul 14 2013, 17:10) *
2. Как объявить структуру как внешнюю, типа extern struct?


Поместите в какой-нибудь инклуд:

Код
struct Data_t {

unsigned char A;

unsigned char B;

};

extern struct Data_t D;

А в ц-файл так:

Код
  
struct Data_t D;





Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jul 14 2013, 14:36
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



_Артём_, спасибо огромное за помощь!!! cheers.gif
Go to the top of the page
 
+Quote Post
igorle
сообщение Jul 26 2013, 20:28
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



рекомендую использовать функцию memcpy()
Она обычно оптимизирована для каждой платформы. В крайнем случае она сделает то же самое копирование байт за байтом, но в большинстве случаев она работает быстрее.
Функция принимает два указателя на void. Так что любой другой указатель приведется к типу (void *) без ворнинга.
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Jul 26 2013, 21:13
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
Хочу ничего не нарушая засунуть ее по байтам во внешнюю память и таким же образом потом считывать.


можно и без union:
Код
struct {
.....................
} s;

int main() {
    uint8_t *src = (void *)&s;
    uint8_t *dest = ....;

    for (size_t c=sizeof(s); c; c-- ) {
        //копирование или что-нибудь другое
        *dest++ = *src++;
    };


Сообщение отредактировал ukpyr - Jul 26 2013, 21:14
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 26 2013, 21:20
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Целый набор граьель. Первое на что попадете — выравнивание. pragma pack (1) хоть пишите. Насчет реализации мемсру — чаще всего плохая, но дело не в этом. Когда я вижу код с мемсру , сразу подозреваю плохой дизайн. Она нужна намного реже, чем ее пользуют.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01474 секунд с 7
ELECTRONIX ©2004-2016