2014-11-13 2 views
0

Я хочу разобрать кусок памяти в структуру. Проблема состоит в том, что члены не одно за другим, а некоторые дополнения.Make struct member dummy

struct foo { 
    unsigned int a; // @ 0 
    unsigned int junk; // @ 0x4 
    unsigned int b; // @ 0x08 
    unsigned int more_junk; 
    ......... 
}; 

Я не хочу назначать каждого члена в структуре для каждого мусора, который у меня есть. Я знаю, что это возможно с профсоюзами, но не уверен в структурах.

Update Я сделаю еще более яркий пример:

#include <stdio.h> 
#include <string.h> 

main() 
{ 

    struct w { 
     unsigned long a; 
     unsigned long b; 
     unsigned long c; 
     unsigned long d; 
    }; 

    struct w *q; 

    unsigned long array[] = 
    { 
     0x11111111, 
     0x22222222, 
     0x33333333, 
     0x44444444 
    }; 

    q = (struct w*)array; 

    printf("%x\n", q->a); 
    printf("%x\n", q->b); 
    printf("%x\n", q->c); 
    printf("%x\n", q->d); 

} 

Выход есть:

11111111 
22222222 
33333333 
44444444 

Lets говорят, что 3-х являются нежелательной. Тот же самый пример:

#include <stdio.h> 
#include <string.h> 

main() 
{ 

    struct w { 
     unsigned long a; 
     unsigned long b; 
     unsigned long d; 
    }; 

    struct w *q; 

    unsigned long array[] = 
    { 
     0x11111111, 
     0x22222222, 
     0x33333333, 
     0x44444444 
    }; 

    q = (struct w*)array; 

    printf("%x\n", q->a); 
    printf("%x\n", q->b); 
    printf("%x\n", q->d); 

} 

Выход:

11111111 
22222222 
33333333 

Но это должно быть:

11111111 
22222222 
44444444 
+0

В памяти есть значения для 'a' и' b', смежные или разделенные пробелом для 'junk'? – JS1

+0

Существует пробел. Все мои члены беззнакомы. Также разрыв не всегда ровный. – selfbg

+0

@selfbg Поскольку ваш вопрос действительно неясен в отношении формата вашего источника данных, все ответы снимаются в темноте. Но из того, что я могу собрать, назначение каждого члена вручную - единственный разумный способ сделать это. – user694733

ответ

0

Ваш вопрос:

  1. Пользователи не одно за другим: Я предлагаю вам переупорядочить членов вашей структуры, чтобы они синхронизировались с блоком памяти, который вы хотите скопировать.
  2. Существует некоторая отступка: Вы можете предотвратить компилятор от заполнения с помощью ключевого слова __attribute__((__packed__)), когда вы определяете свою структуру, которая будет прятать компилятор для прекращения заполнения.
struct __attribute__((__packed__)) foo { 
    unsigned int a; // @ 0 
    unsigned int junk; // @ 0x4 
    unsigned int b; // @ 0x08 
    unsigned int more_junk; 
    ......... 
}; 

После этого вы можете использовать либо memcpy() скопировать содержимое блока памяти в struct foo variable или, если это struct foo *ptr то прямо указывают на память.

Для получения дополнительной информации о STRUCT заполнения и упаковки относятся: Structure padding and packing

1

есть некоторые обивка.

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

Проблема заключается в том, что члены не один за другим я не хочу, чтобы присвоить каждому члену в структуры для каждого барахла, что у меня есть

Не совсем уверен, что вы имеете в виду. Вам не обязательно присваивать ничего, если вы этого не хотите. Тем не менее вам необходимо, чтобы объявить место, где будут отправляться барахлы. Просто объявите фиктивную переменную в структуре, которую вы позже игнорируете, как и в самом первом примере структуры.

Нет никакого способа обойти это, единственной альтернативой является использование совершенно другой структуры данных, такой как простой массив байтов необработанных данных. Но это вряд ли облегчит чтение вашей программы.

Однако, если мусорные байты не должны быть сохранены, то есть вы не делает отображение памяти, но только некоторые «вишневое комплектование» данных, которые вы заинтересованы, то вам не нужны никакие ненужных байты в структурах. Но вам придется назначать каждый элемент вручную, а не использовать memcpy.

Я знаю, что это возможно с профсоюзами

Нет, это не так, я думаю, вы поняли, как союзные работы.

Смежные вопросы