Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb débile

4 réponses
Avatar
fabrizio
désolé je toruvais pas de titre pour un truc aussi...

uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
section_length |= *(TSpacket+offsetPAT+2);
printf("section length: %x\n",section_length);
---
section length: ffb0
---

char tmp;
uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
tmp = *(TSpacket+offsetPAT+2);
section_length |= tmp;
printf("section length: %x\n",section_length);
---
section length: b0
---

le second est le bon .
pouvez-vous me dire comment se passer de cette variable temporaire ?
et donc quelle erreur je fais dans la premiere version.

par avance merci
fabrice

4 réponses

Avatar
Pierre Maurette
fabrizio a écrit:

désolé je toruvais pas de titre pour un truc aussi...

uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
section_length |= *(TSpacket+offsetPAT+2);
printf("section length: %xn",section_length);
---
section length: ffb0
---

char tmp;
uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
tmp = *(TSpacket+offsetPAT+2);
section_length |= tmp;
printf("section length: %xn",section_length);
---
section length: b0
---

le second est le bon .
pouvez-vous me dire comment se passer de cette variable temporaire ?
et donc quelle erreur je fais dans la premiere version.
Si j'avais ce genre de problème (ça m'arrive souvent d'introduire des

tmp pour faciliter le debug), je tenterais d'abord les parenthèses:
section_length |= (*(TSpacket+offsetPAT+2));

--
Pierre

Avatar
Richard Delorme
désolé je toruvais pas de titre pour un truc aussi...

uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
section_length |= *(TSpacket+offsetPAT+2);
printf("section length: %xn",section_length);
---
section length: ffb0
---

char tmp;
uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
tmp = *(TSpacket+offsetPAT+2);
section_length |= tmp;
printf("section length: %xn",section_length);
---
section length: b0
---


Quel est le type de TSpacket ?
Uiliser une variable temporaire de type char peut effectuer une
conversion implicte vers le type char. Si TSpacket est d'un autre type,
il est normal que le résultat soit différent.

PS : - Ecrire *(TSpacket+offsetPAT+2) est une façon compliquée d'écrire
TSpacket[offsetPAT + 2].
- tes printf sont sans doute erronnés. Il fallait écrire :
printf("section length: %hxn",section_length);
ou mieux encore :
std::cout << "section length: " << section_length << std::endl;

le second est le bon .
pouvez-vous me dire comment se passer de cette variable temporaire ?


- avec un conversion explicite ?
section_length |= static_cast<unsigned char>(TSpacket[offsetPAT+2]);

- avec un mask ?
section_length |= (TSpacket[offsetPAT+2] & 0xff);

et donc quelle erreur je fais dans la premiere version.


TSpacket n'est pas de type char ?

--
Richard

Avatar
kanze
fabrizio wrote:
désolé je toruvais pas de titre pour un truc aussi...

uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
section_length |= *(TSpacket+offsetPAT+2);
printf("section length: %xn",section_length);
---
section length: ffb0
---

char tmp;
uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
tmp = *(TSpacket+offsetPAT+2);
section_length |= tmp;
printf("section length: %xn",section_length);
---
section length: b0
---

le second est le bon .
pouvez-vous me dire comment se passer de cette variable temporaire ?
et donc quelle erreur je fais dans la premiere version.


Apparamment, les char sont non-signés chez toi, et TSpacket pointe à
un
char signé. Quand on fait ce genre de manip, c'est prèsque toujours
préférable de passer par des types non-signés.

En attendant, je le trouve aussi souvent préférable d'écrire en
clair
les bits qui nous intéressent, au moyen d'un & 0xFF, par exemple.
Donc,
dans ton cas, j'écrirais quelque chose du genre :

uint16 section_length
= (TSpacket[ offsetPAT+1 ] & 0x0F) << 8
| (TSpacket[ offsetPAT+2 ] & 0xFF) ;

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
fabrizio
uint16 section_length
= (TSpacket[ offsetPAT+1 ] & 0x0F) << 8
| (TSpacket[ offsetPAT+2 ] & 0xFF) ;



merci à Pierre, Richard et James pour vos réponses respectives.

pour la pette histoire :
TSpacket était bien un char*. le transformé en unsigned char * résout
mon probleme, au même titre que la ligne ci-dessus.