Forum: PC-Programmierung bereich vom header wird falsch ausgegeben


von Johannes (Gast)


Lesenswert?

Hallo,
ich habe ein rtp-header, wo die SSRC selber angepasstu wurden. 
Normalerweise ist der SSRC 32 Bit groß
Unser SSRC ist in einem Struct definiert und sieht jetzt wie folgt aus
1
typedef struct rtp_header{
2
3
    unsigned cc:4;     
4
    unsigned x:1; 
5
    unsigned p:1;  
6
    unsigned v:2;  
7
8
    unsigned pt:7; 
9
    unsigned m:1;  
10
11
    uint16   seq_num;
12
    uint32   timestamp;
13
14
    struct
15
    {
16
      unsigned f1:3;
17
      unsigned f2:4;
18
      unsigned f3:4;
19
      unsigned f4:2;
20
      unsigned f5:2;
21
      unsigned f6:1;
22
    }__attribute__ ((packed)) ssrc_own;
23
24
    uint16   ssrc;
25
26
} __attribute__ ((packed)) rtp_header_t;

Alle Daten passen soweit. Aber wenn ich den ssrc_own wie folgt 
beschreibe
f1 = 0b000
f2 = 0b1001
f3 = 0b0010
f4 = 0b01
f5 = 0b00
f6 = 0b0

also 0001001001001000 (0x12 0x48)

bekomme ich heraus
0100100000001001 (0x48 0x09)

ich weiß, dass es etwas mit dem endian zu tun hat. Allerdings bekomme 
ich es absolut nicht hin das Problem zu lösen.

Hat hier jemand evtl einen tip, wie ich es machen könnte?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Müssen es wirklich Bitfields sein? Diese sind nicht portabel, gerade was 
Endianess angeht.

Mach aus ssrc_own ein uint16 ssrc_own und setze die gewünschten Bits per 
Shift und Bitset.

> bekomme ich heraus
> 0100100000001001 (0x48 0x09)

Wie hast Du dies herausbekommen? Du hast über die gepackte struct keine 
union gelegt. Vermutlich über Pointer auf ssrc_own ... genauso 
unportabel.

Zeig bitte mehr Code, bitte. Insbesondere, wie Du die struct beschreibst 
und wie Du sie wieder ausliest.

: Bearbeitet durch Moderator
von Johannes (Gast)


Lesenswert?

Frank M. schrieb:
> Wie hast Du dies herausbekommen

ich logge mir den Datenverkehr mit Wireshark mit. Dort kann ich mir die 
header dann ja gut ansehen

Frank M. schrieb:
> Mach aus ssrc_own ein uint16 ssrc_own und setze die gewünschten Bits per
> Shift und Bitset.

Ja, das ist wohl das einfachste

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.