[LUGOS-PROG] checksum

Rok Papež rok.papez at kiss.uni-lj.si
Sat Jun 29 19:59:52 CEST 2002


Živjo!

Dne sobota 29. junij 2002 16:03 je Blaz Antonic napisal(a):
> Hello,
>
> Recimo da imam eno strukturo
>
> struct abc = {
> 	unsigned long var1;
> 	unsigned short var2;
> 	unsigned char var3[8];
> } * var_abc;
>
> ki okupira 4 + 2 + 8 bajtov. Ce gledam nanjo drugace je na mestu, kamor
> kaze var_abc 7 zaporednih 16-bitnih (short) vrednosti.

Narobe gledaš in delaš napako. Odvisno od prevajalnika.. pa ne samo od tega..
- od distribucije
- platforme
- različice prevajalnika
se lahko poravnava podatkov spremeni.

V pomnilniku namreč zgleda tvoja struktura sledeče:
4B - var1
2B - var2
2B - packing bytes
8B - var3[0]

Pa preverimo s spodnjim programckom:
------------------------
#include <stdio.h>
#include <stdlib.h>

typedef struct _strAbc {
  unsigned long  var1;    // 4B
  unsigned short var2;    // 2B
  unsigned char  var3[8]; // 8B
} strAbc;

int main() {
  strAbc *tmp;
  printf("Struktura zasede: %d Bajtov\n", sizeof(tmp[0]));
  return 0;
}
-------------------------
[rok at Strader tmp]$ ./a.out
Struktura zasede: 16 Bajtov

Točno tako... 16 Bajtov ker so pomnilniški operandi poravnani na 2B. Na
 kakšni drugi platformi lahko dobiš tudi drugačen rezultat. In vrednost
 tistih dveh bajtov ni nujno 0x00!

Dne sobota 29. junij 2002 15:47 je Ales Casar napisal(a):
> > struct abc = {
> > 	unsigned long var1;
> > 	unsigned short var2;
> > 	unsigned char var3[8];
> > } * var_abc;
>
> V bistvu je problem v tem, da indeksiranje in typecasting pocnes v
> napacnem vrstnem redu. Najprej moras najprej strukturi pretvoriti v polje
> "unsigned short"-ov, potem se pa z indeksom sprehoditi preko njega in
> sesteti posamezne elemente. Torej nekako takole:
>
>       sum += ((unsigned short *) var_abc)[i];

Sorry to rain on your parade. Še vedno ni pravilno zaradi gornjih razlogov:

var_abc ptr;
unsigned long sum;

sum = ptr->var1 + ptr->var2;
for(i=0; i<8; i++) {
#ifdef NULL_STRING
  if(!ptr->var3[i])
    break;
#endif /* NULL_STRING */
  sum += ptr->var3[i];
}

Če var3 vsebuje null terminated string moraš upoštevati še nasvet, ki ga je
dal Sašo. V tem primeru pognati gcc s stikalom -DNULL_STRING

Žal... ne moreš rezati ovinkov.. razen morda, če vedno alociraš strukturo z
calloc ali malloc/memset(0x00). Pa še to odsvetujem. Dandanes je HW tako
poceni in zmogljiv, da te največ stane iskanje napak v SW in ne nakup
zmogljivejšega HW.

--
best regards,
Rok Papež.




More information about the lugos-prog mailing list