» »

[C] bit order?

[C] bit order?

shock ::

Pozdravljeni,

Imam en težavo glede bit order-ja, kaj moram naredit sledeči kodi da mi izpiše rezultat "1"? Ko skompajlam sledečo kodo in zaženem program mi vrne rezultat "32".
struct tsHeader {
        unsigned ID1 : 3;
        unsigned ID2 : 13;
};

int main(int argc, char *argv[]) {
  unsigned char recv_str[100];
  recv_str[0] = 0x00;
  recv_str[1] = 0x01;

  struct tsHeader * tshdr;
  tshdr = malloc(sizeof(struct tsHeader));
  tshdr = (struct tsHeader *) recv_str;
  printf("ID2 = %d\n", tshdr->ID2);
}

#############################
# gcc -o test test.c
# ./test
ID2 = 32
  • spremenil: Mavrik ()

Vesoljc ::

shock je izjavil:


struct tsHeader * tshdr;
tshdr = malloc(sizeof(struct tsHeader));
tshdr = (struct tsHeader *) recv_str;


kazalcu ki kaze na novo alocirano strukturo povozis vrednost z naslovom polja recv_str...
ce ze, naredi vsaj memcpy, vendar pa to na tak nacin ne bo delovalo, ker prevajalnik ne ve, da hoces zapisati tri bite v prvi del, 13 ostalih pa v drugi del... zgodi se pac blind copy
Abnormal behavior of abnormal brain makes me normal...

shock ::

Našel sem kje je problem. Problem je pri low in big endianu. Pri defeniranju strukture sem moral dodat "#if BYTE_ORDER == BIG_ENDIAN"


struct tsHeader {
#if BYTE_ORDER == BIG_ENDIAN
unsigned ID1 : 3;
unsigned ID2_hi : 5;
#else
unsigned ID2_hi : 5;
unsigned ID1 : 3;
#endif
unsigned ID2_lo : 8;
};




// Dajmo uporabljat st.koda tage no :) -- moderator

Zgodovina sprememb…

  • spremenil: Mavrik ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] malloc, sigsegv

Oddelek: Programiranje
6966 (768) Andrej4
»

[C] problem s kazalci

Oddelek: Programiranje
141270 (1031) BigWhale
»

[C#] unmanaged->managed code

Oddelek: Programiranje
112062 (1937) Zzzzzzz
»

[NALOGA][C] fri-vsp - strukture (struct)

Oddelek: Programiranje
101464 (1305) Vesoljc
»

Delo z omrezjem v linuxu

Oddelek: Programiranje
101219 (1065) CCfly

Več podobnih tem