Если ваш компилятор не вводит какие-либо блоки выравнивания в этой структуре (убедитесь, что CHAR_BIT
равен 8, а sizeof(struct ipheader)
равен 20), вы просто сможете включить его в свой код как есть, а затемдобавьте что-то вроде:
struct ipheader *iph = (struct ipheader *)blk;
printf ("TTL = %d\n", iph->ip_ttl);
В этом коде у вас будет заголовок IP, на который указывает blk
, что, вероятно, char*
.Приведение его к правильному типу указателя позволит вам легко получить доступ к полям.
Следующая полная программа показывает это в действии:
#include <stdio.h>
#include <limits.h>
struct ipheader {
/* 0 */ unsigned char ip_hl:4, ip_v:4;
/* 1 */ unsigned char ip_tos;
/* 2 */ unsigned short int ip_len;
/* 3 */ unsigned short int ip_id;
/* 4 */ unsigned short int ip_off;
/* 5 */ unsigned char ip_ttl;
/* 6 */ unsigned char ip_p;
/* 7 */ unsigned short int ip_sum;
/* 8 */ unsigned int ip_src;
/* 9 */ unsigned int ip_dst;
};
int main (void) {
char blk[] = {
'\x00','\x11','\x22','\x22','\x33','\x33','\x44','\x44',
'\x55','\x66','\x77','\x77','\x88','\x88','\x88','\x88',
'\x99','\x99','\x99','\x99'
};
struct ipheader *iph = (struct ipheader *)(&blk);
printf ("TTL = %x\n", iph->ip_ttl);
printf ("sum = %x\n", iph->ip_sum);
printf ("dst = %x\n", iph->ip_dst);
return 0;
}
Вывод, как и ожидалось:
TTL = 55
sum = 7777
dst = 99999999