Envoyé par
Lolita59
- Qu'est-ce qu'un flux d'octets ?
c'est pour moi un ensemble d'octets bout à bout composant une trame qui est envoyé sur un réseau après encapsulation dans UDP (dans mon cas).
OK. Dans un programme C, on utilise une fonction qui envoi un bloc de donnée (sendto()). Ce bloc est matérialisé par un tableau de unsigned char dont on passe l'adresse et le nombre d'élements à envoyer à sendto().
Envoyé par
Lolita59
- Que signifie BER ?
Basic Encoding Rules, ce sont les normes du codage de données. Cela fonctionne selon le modèle TLV (Type Longueur Valeur)
TLV, certes, mais c'est un peu plus complexe que ça. Il y a une notion de structure et de plus le codage de la longueur est assez tordu si je me souviens bien...
Envoyé par
Lolita59
- Qu'est-ce qu'un entier en BER ?
Un entier en BER est un nombre possédant le tag 0x02 mais sinon c'est juste un entier qui est ensuite codé en binaire
Il manque des informations importantes :- la taille (nombre de bits ou d'octets)
- la représentation (emplacement du MSB etc.)
Envoyé par
Lolita59
- Quelle est la représentation d'un entier en BER ?
le tag : 00000010 ou 0x02
la taille : 00000100
sa valeur : ********
Bon, on a la taille (4 octets, je suppose...)
Il manque toujours la représentation mémoire. Zul a esquissé une solution, mais il faudrait être sûr du format (Sur un réseau, les conventions habituelles, c'est 'MSB en tête')
Envoyé par
Lolita59
Donc je sais pas si j'ai tout bien compris mais ma question serait plutot : Comment on crée une chaine binaire dans laquelle mettre tous mes élements en les formatant en binaire en fait ?
Ca dépend du format demandé.
Si on admet MSB en tête, on doit donc mettre un mot de 32 bits dans un bloc de 4 octets selon le principe suivant :
1 2 3 4 5 6
| unsigned long data = 123456;
bloc[0] = (data >> (8 * 3)) & 0xFF; /* MSB */
bloc[1] = (data >> (8 * 2)) & 0xFF;
bloc[2] = (data >> (8 * 1)) & 0xFF;
bloc[3] = (data >> (8 * 0)) & 0xFF; /* LSB */ |
Ce bloc peut évidemment faire partie d'un buffer d'émission, dana ce cas, on a (par exemple)
1 2 3 4 5 6
| buffer[0] = 0x02; /* T INTEGER */
buffer[1] = 0x04; /* L */
buffer[2] = (data >> (8 * 3)) & 0xFF; /* V : MSB */
buffer[3] = (data >> (8 * 2)) & 0xFF;
buffer[4] = (data >> (8 * 1)) & 0xFF;
buffer[5] = (data >> (8 * 0)) & 0xFF; /* LSB */ |
Envoyé par
Lolita59
Ainsi que ceci : Si je met mes élements dans une chaine de caractères, est-ce que lors de leur envoi dans la trame finale, ceux ci sont codés en binaire ? Et dans quel type faut-il les mettre pour que lors de leur codage en binaire, ils soient décodable de l'autre coté...
En BER, aucune 'chaine de caractère' au sens 'C' n'est transmise. Néanmoins, si tu as un tag STRING, une simple copie des caractères suffit, précédée, comme d'habitude, des champs T et L.
Par exemple :
1 2 3 4 5 6 7 8 9 10
| char const *s = "Hello";
buffer[0] = STRING; /* T */
buffer[1] = strlen(s); /* L SI < 128 */
buffer[2] = s[0]; /* V : 'H' */
buffer[3] = s[1]; /* V : 'e' */
buffer[4] = s[2]; /* V : 'l' */
buffer[5] = s[3]; /* V : 'l' */
buffer[6] = s[4]; /* V : 'l' */
buffer[7] = s[5]; /* V : 'o' */ |
on peut aussi utiliser memcpy()...
memcpy (buffer+ 2, s, buffer[1]); /* V : "Hello" */
Attention. Si je me souviens bien, si la longueur est > 127, le codage de celle-ci est différent...
Partager