ho questa struct C: (in rappresentanza di un datagramma IP)Memoria di campi di bit struct avere
struct ip_dgram
{
unsigned int ver : 4;
unsigned int hlen : 4;
unsigned int stype : 8;
unsigned int tlen : 16;
unsigned int fid : 16;
unsigned int flags : 3;
unsigned int foff : 13;
unsigned int ttl : 8;
unsigned int pcol : 8;
unsigned int chksm : 16;
unsigned int src : 32;
unsigned int des : 32;
unsigned char opt[40];
};
sto assegnazione di valori ad esso, e quindi la stampa il suo layout di memoria in parole di 16 bit come questo:
//prints 16 bits at a time
void print_dgram(struct ip_dgram dgram)
{
unsigned short int* ptr = (unsigned short int*)&dgram;
int i,j;
//print only 10 words
for(i=0 ; i<10 ; i++)
{
for(j=15 ; j>=0 ; j--)
{
if((*ptr) & (1<<j)) printf("1");
else printf("0");
if(j%8==0)printf(" ");
}
ptr++;
printf("\n");
}
}
int main()
{
struct ip_dgram dgram;
dgram.ver = 4;
dgram.hlen = 5;
dgram.stype = 0;
dgram.tlen = 28;
dgram.fid = 1;
dgram.flags = 0;
dgram.foff = 0;
dgram.ttl = 4;
dgram.pcol = 17;
dgram.chksm = 0;
dgram.src = (unsigned int)htonl(inet_addr("10.12.14.5"));
dgram.des = (unsigned int)htonl(inet_addr("12.6.7.9"));
print_dgram(dgram);
return 0;
}
ottengo questo output:
00000000 01010100
00000000 00011100
00000000 00000001
00000000 00000000
00010001 00000100
00000000 00000000
00001110 00000101
00001010 00001100
00000111 00001001
00001100 00000110
Ma mi aspetto che questo:
012.351.641.061.L'uscita è parzialmente corretta; da qualche parte, i byte e i bocconcini sembrano essere scambiati. C'è qualche problema di endianità qui? I bit-field non sono adatti a questo scopo? Davvero non lo so. Qualsiasi aiuto? Grazie in anticipo!
possibile duplicato di [Perché bit endianness è un problema in bitfield?] (Http://stackoverflow.com/questions/6043483/why-bit-endianness-is-an-issue-in-bitfields) – Lundin
Dai uno sguardo a come ad es lo stack di rete Linux o BSD fa questo. – vonbrand