struct vuv union - union na 2 byte offset
14 отговора
614 прегледа
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
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
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" :)
i kato si trygnal taka, sigurno(bi triabwalo) da te zainteriguwat oste 4 dumi
"little endian", "big endian" :)
Re: struct vuv union - union na 2 byte offset
"host byte order" i "network byte order" syshto :-)
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 :))
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 :))
Re: struct vuv union - union na 2 byte offset
а каво им има на ntohs и ntohl функциите? ако пишеш на С, това е решението ако си ASM пич, май ше трябва сам да си ги имплементираш, не е толкова трудно
а по въпроса дали "може по някакъв начин да не преобразуваш биг и лител ендиан" - ами може разбира се, никой не те кара насила
ако обаче искаш твоите програми да работят - трябва да се преобразува, няма как иначе :)
а по въпроса дали "може по някакъв начин да не преобразуваш биг и лител ендиан" - ами може разбира се, никой не те кара насила
ако обаче искаш твоите програми да работят - трябва да се преобразува, няма как иначе :)
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
#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
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?
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
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
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
10x INDY
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 и ще си спестиш грижи
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 и ще си спестиш грижи
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.
#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.
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
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
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
Mersi mnogo ... ako ne bqha tiq klubove koj znae do koga shtqh da se lutam :))
INDY
за depedence
Според мен основния въпрос който е трябвало да решиш в случая е, дали да си хардуерно зависим и структурата да ти изглежда по един и същи начин на всички платформи (hardware dependent) или да работиш на ниво С като структурата може да си променя голимената в зависимост от допълнителни настройки (OS independent).
В първия случай ще трябва сам да си решаваш мултиплатформинга (ifdef - elseif), но ще имаш възможност да пишеш и на асемблер без много затруднения. Във втория ще трябва да се ограничиш до използване на библиотеките на С.
Щом в бъдеще ще трябва да поддържаш повече платформи хубаво е още отсега да помислиш за тия неща. pragma-та е много силна във VS и аз я експлоатирам безмилостно
, обаче за проекти които са твърдо на VS и няма да мърдат. За съвместимост по други компилатори ти препоръчвам да се ограничаваш до ANSI, понеже иначе се явяват какви ли не проблеми. Преди време имаше една тема за това, че примерно:
int a = 2
int b = a + a++;
на един компилатор ще даде b==4, а на друг b==5.
Със здраве.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
В първия случай ще трябва сам да си решаваш мултиплатформинга (ifdef - elseif), но ще имаш възможност да пишеш и на асемблер без много затруднения. Във втория ще трябва да се ограничиш до използване на библиотеките на С.
Щом в бъдеще ще трябва да поддържаш повече платформи хубаво е още отсега да помислиш за тия неща. pragma-та е много силна във VS и аз я експлоатирам безмилостно
int a = 2
int b = a + a++;
на един компилатор ще даде b==4, а на друг b==5.
Със здраве.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.