struct vuv union - union na 2 byte offset

14 отговора 614 прегледа
#1

struct vuv union - union na 2 byte offset

typedef struct ip_header{
u_char ver_ihl;
...
ip_address daddr;
u_int op_pad;
};

typedef struct ethernet_header{
mac_address dmac; /* 6 bytes */
mac_address smac; /* 6 bytes */
u_short type;
union {
u_short type;
struct ip_header ip;
RAW_Data RAW;
};
}ethernet_header;

Zashto ima 2 bytes otmestvane mejdu ethernet_header.type i ethernet_header.ip.ver_ihl

prosto nqma nikakva logika

Отговор
в отговор на lNDY #2

Re: struct vuv union - union na 2 byte offset

zaradi alignmenta

Отговор
в отговор на lNDY #3

Re: struct vuv union - union na 2 byte offset

imam edna duma za teb - "aligment", chuwal li si ia?
i kato si trygnal taka, sigurno(bi triabwalo) da te zainteriguwat oste 4 dumi
"little endian", "big endian" :)

Отговор
в отговор на tux #4

Re: struct vuv union - union na 2 byte offset

"host byte order" i "network byte order" syshto :-)

Отговор
в отговор на lNDY #5

Re: struct vuv union - union na 2 byte offset

OK ... razbrah che sum tupo kopele ... alighment ... byte order ... big endian ... little endian ... znam gi tiq raboti ... samo deto nemojah da namerq nishto za premestvane ot bigednian to littlendian osven ntohs ntohl za c++ ... nqma daje i okazanie nito linker-a i compler-a da gi obrushta ...

nqkoj shte mi kaje li kak da si opravq geshtkata i kakvo tochno mi e tupata greshka ... pls

P.S. Tova sashto e bolna tema - moga li po nqkakuv nachin da ne polzvam funkciq za preobrushtane na big to little endian ... az sum ASM pich ama i gi razbiram tiq neshta mnogo dobre prosto sega mi se naloji da se zadolbocha poveche v C-to

:)) 10x predvaritelno za vsqki vazmojen otgovor :))

Отговор
в отговор на lNDY #6

Re: struct vuv union - union na 2 byte offset

а каво им има на ntohs и ntohl функциите? ако пишеш на С, това е решението ако си ASM пич, май ше трябва сам да си ги имплементираш, не е толкова трудно

а по въпроса дали "може по някакъв начин да не преобразуваш биг и лител ендиан" - ами може разбира се, никой не те кара насила
ако обаче искаш твоите програми да работят - трябва да се преобразува, няма как иначе :)

Отговор
в отговор на lNDY #7

Re: struct vuv union - union na 2 byte offset

pod MSVC alignmenta mozhe da se nastroi chrez

#pragma pack(push)
#pragma pack(1) // Alignment 1 BYTES (normalno e 4 za 32bitovia rezhim na x86 mashinite - kakto si widjal w tvoja sluchai)

struct { }

.....

#pragma pack(pop) // Pravilno e da pushwash/popwash state - tuj kato inache bi mogul da razrusish nekoi drugi strukturi, predpolagajki che za tjah alignmenta e 4

za gcc - wizh zapazenata dumichka __attribute__((packed)) // Oburni wnimanie che sa dve skobi ne edna eto primer:

typedef struct {
char a;
int b __attribute__((packed)); // Tova shte slozhi b tochno do a, ako go njama shteshe da slozhi 3 baita dupka - ili padding
... .
} Something;

Proveri za attribute oshte tuka [линк]

i za MSVC - wizh MSDN-a - proveri #pragma

Отговор
в отговор на edianec #8

Re: struct vuv union - union na 2 byte offset

dobre, i spored teb - suveta ti shte mu dade li njakakwa pomosht? Za kvo napisa cjalata tazi istoria otnosno ASM-to? huh?

Отговор
в отговор на malkia #9

Re: struct vuv union - union na 2 byte offset

Vuzmojno li e da nastroq alligment-a samo za opredelenite sluchai i pak da si ostane po 4 na block ? i kak bi stanalo v sluchaq shtoto kato napravq

typedef struct ethernet_header{
mac_address dmac; /* 6 bytes */
mac_address smac; /* 6 bytes */
u_short type __attribute__((packed));
union {
RAW_Data RAW;
struct ip_header ip;
};
}ethernet_header;

ili
typedef struct ethernet_header{
mac_address dmac; /* 6 bytes */
mac_address smac; /* 6 bytes */
u_short type;
union {
RAW_Data RAW;
struct ip_header ip;
}__attribute__((packed));
}ethernet_header;

me e be kompilatora ...

10x IDNY

Отговор
в отговор на lNDY #10

Re: struct vuv union - union na 2 byte offset

BTW ne che nqma maj da se naloja da go prerabotvam za GNU ama v momenta trqbva da go pisha na Visual C++ ... znam che e gadno ama nqma drug nachin

10x INDY

Отговор
в отговор на lNDY #11

Re: struct vuv union - union na 2 byte offset

u_short Type;
union {
u_short type;
struct ip_header ip;
RAW_Data RAW;
};
ethernet_header.Type i ethernet_header.ip.ver_ihl
V sastnost izpolzvas Type a ne type ot uniona....
a Type ti e tochno 2 bytes
Ama si go napisal type i se chudia kak li tochno kompilatora te e pusnal izobsto - ot kade da znae choveka za koj type stava vapros za tozi ot uniona ili tozi deto e predi uniona.
Забий Data aligment=Byte и ще си спестиш грижи

Отговор
в отговор на lNDY #12

Re: struct vuv union - union na 2 byte offset

ako e samo za MSVC to prosto zagradi otpred i otzad sus edno

#pragma pack(push,1) // tova e ravnosilno na #pragma pack(push) i sled tova #pragma pack(1)
struct Something{}
#pragma pack(pop)

wsushnost razgledaj njakoi ot sistemnite si headeri sus MSVC-to - potursi - #pragma pack - da widish te kak go polzwat.

Отговор
в отговор на lNDY #13

Re: struct vuv union - union na 2 byte offset

typedef struct ip_header{
u_char ver_ihl;
...
ip_address daddr;
u_int op_pad;
};

typedef struct ethernet_header{
mac_address dmac; /* 6 bytes */
mac_address smac; /* 6 bytes */
u_short type;
union {
struct ip_header ip;
RAW_Data RAW;
};
}ethernet_header;

tova veche e pravilniq kod ... bez type v union-a

ivsepak zashto imam problem tochno an mqstoto kudeto slagam poveche ot edna struktura na edno i sushto mqsto a pri susdavane na struktora sichko si e bez gap-ove ... puk i pri tova na drugi ezici nikoga ne mi e pravil gap v struktorata

Отговор
в отговор на malkia #14

Re: struct vuv union - union na 2 byte offset

Eeee mashala ... naj nakraq potrugna kakto trebe ...

Mersi mnogo ... ako ne bqha tiq klubove koj znae do koga shtqh da se lutam :))

INDY

Отговор
в отговор на lNDY #15

за depedence

Според мен основния въпрос който е трябвало да решиш в случая е, дали да си хардуерно зависим и структурата да ти изглежда по един и същи начин на всички платформи (hardware dependent) или да работиш на ниво С като структурата може да си променя голимената в зависимост от допълнителни настройки (OS independent).

В първия случай ще трябва сам да си решаваш мултиплатформинга (ifdef - elseif), но ще имаш възможност да пишеш и на асемблер без много затруднения. Във втория ще трябва да се ограничиш до използване на библиотеките на С.

Щом в бъдеще ще трябва да поддържаш повече платформи хубаво е още отсега да помислиш за тия неща. pragma-та е много силна във VS и аз я експлоатирам безмилостно , обаче за проекти които са твърдо на VS и няма да мърдат. За съвместимост по други компилатори ти препоръчвам да се ограничаваш до ANSI, понеже иначе се явяват какви ли не проблеми. Преди време имаше една тема за това, че примерно:

int a = 2
int b = a + a++;

на един компилатор ще даде b==4, а на друг b==5.

Със здраве.

Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Отговор