reseaux:generalites:cbor

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
reseaux:generalites:cbor [2021/11/20 17:59] – [1.5 Type objets (Liste de paires)] philreseaux:generalites:cbor [2021/12/19 08:19] (Version actuelle) – [La sérialisation (suite)] phil
Ligne 2: Ligne 2:
  
 ===== La sérialisation (suite)===== ===== La sérialisation (suite)=====
-[Mise à jour le 20/11/2021]+[Mise à jour le 19/12/2021]
  
 ==== 1. CBOR ==== ==== 1. CBOR ====
 {{ :reseaux:generalites:cbor.png?nolink&80|}} {{ :reseaux:generalites:cbor.png?nolink&80|}}
-  * **Vidéo** sur YouTube <html><a href="https://www.youtube.com/watch?v=thSWuJ-1ld0&t=546s" target="_blank">CBOR2</a></html>+  * **Vidéo** sur YouTube <html><a href="https://www.youtube.com/watch?v=thSWuJ-1ld0&t" target="_blank"><strong>CBOR2</strong></a></html>
  
 JSON et CBOR sont tous les deux des modes de codage de la donnée. JSON et CBOR sont tous les deux des modes de codage de la donnée.
Ligne 12: Ligne 12:
 JSON introduit une notation très flexible permettant de représenter toutes les structures de données. Le choix de l'ASCII rend ce format universel et n'importe quel ordinateur pourra le comprendre. Mais l'utilisation de l'ASCII ne permet pas de transmettre de manière optimale l'information sur un réseau. Quand les réseaux ont un débit raisonnable, cela ne pose pas de problème. Quand on en vient à l'internet des objets, il faut prendre en compte la capacité de traitement limité des équipements et la faible taille des messages échangés. JSON introduit une notation très flexible permettant de représenter toutes les structures de données. Le choix de l'ASCII rend ce format universel et n'importe quel ordinateur pourra le comprendre. Mais l'utilisation de l'ASCII ne permet pas de transmettre de manière optimale l'information sur un réseau. Quand les réseaux ont un débit raisonnable, cela ne pose pas de problème. Quand on en vient à l'internet des objets, il faut prendre en compte la capacité de traitement limité des équipements et la faible taille des messages échangés.
  
-Ainsi, en <html><a href="https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange" target="_blank">ASCII</a></html>, la valeur 123 est codée sur 3 octets (un octet par caractère) tandis qu'en binaire elle n'occuperait qu'un seul octet : 0111 1011. +Ainsi, en <html><a href="https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange" target="_blank"><strong>ASCII</strong></a></html>, la valeur 123 est codée sur 3 octets (un octet par caractère) tandis qu'en binaire elle n'occuperait qu'un seul octet : 0111 1011. 
  
-<html><a href="https://www.bortzmeyer.org/7049.html" target="_blank">CBOR</a></html> (**Concise Binaire Object Representation**), défini dans le <html><a href="https://www.bortzmeyer.org/7049.html" target="_blank">RFC 7049</a></html>, permet de représenter les structures de JSON mais suivant une représentation binaire.Si CBOR est complètement compatible avec JSON, il est possible de représenter d'autres types d'information très utiles dans l'internet des objets.+<html><a href="https://www.bortzmeyer.org/7049.html" target="_blank">CBOR</a></html> (**Concise Binaire Object Representation**), défini dans le <html><a href="https://www.bortzmeyer.org/7049.html" target="_blank"><strong>RFC 7049</strong></a></html>, permet de représenter les structures de JSONmais suivant une représentation binaire.Si CBOR est complètement compatible avec JSON, il est possible de représenter d'autres types d'information très utile dans l'internet des objets.
  
-La taille de l'information est réduite et le traitement simplifié. Il faut savoir un peu jongler avec la représentation binaire mais cela reste basique.+La taille de l'information est réduite et le traitement simplifié. Il faut savoir un peu jongler avec la représentation binairemais cela reste basique.
  
-CBOR définit 8 types majeurs qui sont représentés par les 3 premiers bits d'une structure CBOR. Ces types majeurs ont donc des valeurs comprises entre 0 et 7 (000 à 111 en binaire). \\ {{ :reseaux:generalites:cbor1.png?nolink& |}}+CBOR définit **8 types** majeurs qui sont représentés par les **3 premiers bits d'une structure CBOR**. Ces types majeurs ont donc des valeurs comprises entre **0** et **7** (000 à 111 en binaire). \\ {{ :reseaux:generalites:cbor1.png?nolink& |}}
  
-Les cinq bits suivants contiennent soit une valeur soit une longueur indiquant combien d'octets sont nécessaires pour coder la valeur. CBOR offre ainsi des optimisations qui permettent de réduire la longueur totale de la structure des données +Les **cinq bits suivants** contiennent soit une **valeur** soit une **longueur** indiquant combien d'octets sont nécessaires pour coder la valeur. CBOR offre ainsi des optimisations qui permettent de réduire la longueur totale de la structure des données
  
 === 1.1 Type Entier Positif === === 1.1 Type Entier Positif ===
Ligne 49: Ligne 49:
 </code> </code>
  
-Le module cbor utilise comme pour JSON la méthode dumps pour sérialiser une structure interne de Python dans la représentation demandée. À l'inverse, la méthode loads sera utilisée pour importer une structure CBOR dans une représentation interne.+Le module cbor utilise comme pour JSON la méthode **dumps** pour sérialiser une structure interne de Python dans la représentation demandée. À l'inverse, la méthode **loads** sera utilisée pour **importer** une structure CBOR dans une représentation interne.
  
-La boucle permet d'avoir les multiples de 10 (variable v). Le print en ligne 7 permet d'aligner les données pour que l'affichage soit plus clair ; entre les accolades, le premier chiffre indique la position dans les arguments de format ; le second, après le :, le nombre de caractères. Par exemple, {1:30} indique l'argument v de format affiché sur 30 caractères.+La boucle permet d'avoir les multiples de 10 (variable v). Le print en ligne 7 permet d'aligner les données pour que l'affichage soit plus clair ; entre les accolades, le premier chiffre indique la position dans les arguments de format ; le second, après le :, le nombre de caractères.  
 + 
 +Par exemple, {1:30} indique l'argument v de format affiché sur 30 caractères.
  
 Le programme donne le résultat suivant : Le programme donne le résultat suivant :
Ligne 80: Ligne 82:
 La taille de la représentation s'adapte à la valeur. Ainsi, il n'est pas nécessaire de définir une taille fixe pour coder une donnée. La taille de la représentation s'adapte à la valeur. Ainsi, il n'est pas nécessaire de définir une taille fixe pour coder une donnée.
  
-On peut aussi noter que comme le type majeur est sur 3 bits, ce type peut être reconnu car il commence par la valeur "0" ou "1+On peut aussi noter que comme le type majeur est sur 3 bits, ce type peut être reconnucar il commence par la valeur "0" ou "1
  
 === 1.2 Type entier négatif === === 1.2 Type entier négatif ===
Ligne 87: Ligne 89:
 Ainsi, pour coder -15, on va coder la valeur 14, ce qui donne en binaire 001-1 1110. Ainsi, -24 peut également être codé sur 1 octet tandis que +24 sera codé sur 2 octets. Ainsi, pour coder -15, on va coder la valeur 14, ce qui donne en binaire 001-1 1110. Ainsi, -24 peut également être codé sur 1 octet tandis que +24 sera codé sur 2 octets.
  
-Le programme //cbor-integer-ex2.py// reprend le même code mais pour des puissances de 10 négatives.+Le programme //cbor-integer-ex2.py// reprend le même codemais pour des puissances de 10 négatives.
  
 <code python cbor-integer-ex2.py> <code python cbor-integer-ex2.py>
Ligne 183: Ligne 185:
 </code> </code>
  
-<note tip>Le site web <html><a href="https://cbor.me/" target="_blank">cbor.me</a></html> permet de faire automatiquement le codage dans un sens ou dans l'autre.</note>+<note tip>Le site web <html><a href="https://cbor.me/" target="_blank"><strong>cbor.me</strong></a></html> permet de faire automatiquement le codage dans un sens ou dans l'autre.</note>
  
 La colonne de gauche représente la donnée en JSON et celle de droite en CBOR (dite "représentation canonique" qui facilite la lecture). La colonne de gauche représente la donnée en JSON et celle de droite en CBOR (dite "représentation canonique" qui facilite la lecture).
Ligne 191: Ligne 193:
 {{ :reseaux:generalites:capture_d_e_cran_2018-05-21_a_20.34.05.png?nolink&900 |}} {{ :reseaux:generalites:capture_d_e_cran_2018-05-21_a_20.34.05.png?nolink&900 |}}
  
-<note tip>On peut calculer le degré de compression de CBOR. Ainsi, dans le premier exemple, le tableau JSON [1,2,3,4] faisait 9 caractères tandis que la représentation CBOR n'en faisait que 5. Pour le dernier exemple (illustration ci dessus), les 13 octets de la représentation CBOR sont transformés en 34 caractères (donc 34 octets) en JSON.</note>+<note tip>On peut calculer le degré de compression de CBOR. Ainsi, le tableau JSON [1,2,3,4] est codé sur 9 caractères tandis que la représentation CBOR 8401020304 n'en fait que 5. Pour l'illustration ci dessus, les 13 octets de la représentation CBOR sont transformés en 34 caractères (donc 34 octets) en JSON.</note>
  
  
Ligne 237: Ligne 239:
 On peut voir des différences entre JSON, CBOR et la représentation des variables en Python. Les codages hexadécimaux et binaires de Python ont été convertis en décimal pour JSON.  On peut voir des différences entre JSON, CBOR et la représentation des variables en Python. Les codages hexadécimaux et binaires de Python ont été convertis en décimal pour JSON. 
  
-De plus, même si JSON n'autorise que des clés en ASCII pour indexer les paires , nous avons pu mettre des clés numériques. Néanmoins Python a effacé la première clé 2 par la dernière. CBOR définit un mode strict dans lequel ces clés doivent être codées en ASCII pour être compatibles avec JSON mais autorise également des représentations qui diffèrent de JSON en enlevant les contraintes sur les clés.+De plus, même si JSON n'autorise que des clés en ASCII pour indexer les paires , nous avons pu mettre des clés numériques. Néanmoins Python a effacé la première clé 2 par la dernière. CBOR définit un mode strict dans lequel ces clés doivent être codées en ASCII pour être compatibles avec JSONmais autorise également des représentations qui diffèrent de JSON en enlevant les contraintes sur les clés. 
 === 1.6 Type étiquette === === 1.6 Type étiquette ===
 +CBOR enrichit le typage des données ; ce qui permet de manipuler plus facilement des données. Par exemple, une chaîne de caractères peut représenter une date, une URI, voire une URI codée en base 64. 
 +
 +<note tip>Le type **110** peut être suivi d'une valeur dont une liste exhaustive est donnée <html><a href="https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml" target="_blank"><strong>ici</strong></a></html>.</note>
 +
 +Par exemple, le programme //cbor-tag.py// affiche la date du jour, la convertit en notation CBOR et la reconvertit en variable Python grâce à la méthode loads.
 +
 +<code python cbor-tag.py>
 +import cbor2 as cbor
 +from datetime import date, timezone
 +
 +print (date.today()) # 2018-05-22
 +c1 = cbor.dumps(date.today(), timezone=timezone.utc, date_as_datetime=True)
 +
 +print (c1.hex()) # c074323031382d30352d32325430303a30303a30305a
 +
 +print (cbor.loads(c1)) # 2018-05-22 00:00:00+00:00
 +print (type(cbor.loads(c1))) # <class ’datetime.datetime’>
 +</code>
 +
 +La représentation canonique montre plus facilement le tag dans la séquence binaire :
 +
 +<code>
 +C0                                      # tag(0)
 +   74                                   # text(20)
 +      323031382D30352D32325430303A30303A30305A # "2018-05-22T00:00:00Z"
 +</code>
 +
 +Le tag 0 implique un format normalisé pour la date ; d'où l'ajout des heures, minutes et secondes, alors qu'elles n'ont pas été spécifiées initialement.
 +
 +<note tip>On peut également remarquer que loads retourne un type date et non une chaîne de caractères.</note>
 +=== 1.7 Le type flottant et les valeurs particulières ===
 +Le dernier type majeur (**111**) permet de coder les nombres flottants en utilisant la représentation définie par l'**IEEE 754**. Suivant la taille de la représentation, la suite de l'octet contient les valeurs 25 (demi précision sur 16 bits), 26 (simple précision sur 32 bits) ou 27 (double précision sur 64 bits).
  
-=== 1.7 Le type flottant et valeurs particulières ===+Ce type permet également de coder les valeurs définies par JSON : True (valeur 20), False (valeur 21) ou None (valeur 22).
  
 +<note tip>Finalement, ce type peut indiquer la fin d'un tableau ou d'une liste de paires quand la taille n'est pas connue au début du codage.</note>
  
 +=== 1.8 CBOR sur des exemples ===
 +  * **Vidéo** Youtube : site <html><a href="https://www.youtube.com/watch?v=h1XnaFy_FoI" target="_blank"><strong>cbor.me</strong></a></html>
  • reseaux/generalites/cbor.1637427567.txt.gz
  • Dernière modification : 2021/11/20 17:59
  • de phil