Packed Encoding Rules

Principe utilisé par Up ! Abstract Syntax Notation One

Le standard Packed Encoding Rules (PER) de l'International Telecommunication Union (ITU) permet d'encoder et de décoder un flux Abstract Syntax Notation One (ASN.1) en un flux binaire de façon optimisé en tenant compte des contraintes, ce que ne fait pas le codage Basic Encoding Rules (BER).

Contraintes générant une optimisation

Ces contraintes sont dites visibles du point de vue du standard Packed Encoding Rules (PER).

En Basic Encoding Rules (BER), le triplet (Préambule, Taille, Valeur) est irréductible. En Packed Encoding Rules (PER), chaque composante peut être optionnelle, étant donné que de part la contrainte le type, la taille ou la valeur peut être déduit.

BIT STRING

Voici les optimisations prises en compte :

IA5String

Voici les optimisations prises en compte :

Ces optimisations s'appliquent aux types BMPString, IA5String, ISO646String, NumericString, PrintableString, UniversalString et VisibleString.

Ces optimisations ne s'appliquent pas aux types GeneralizedTime, ObjectDescriptor ou UTCTime.

CHARACTER STRING

EMBEDDED-PDV

INTEGER

Voici les optimisations prises en compte :

OCTET STRING

Voici les optimisations prises en compte :

SEQUENCE OF

Voici les optimisations prises en compte :

SET OF

Voici les optimisations prises en compte :

Combinaison de contraintes

Les combinaisons de contraintes par les opérateurs |, ^ ou les instructions correspondantes ne sont possibles que si chaque contrainte élémentaire est optimisable.

Par exemple :

L'encodeur et le décodeur Packed Encoding Rules (PER) doivent donc calculer l'intervalle au plus juste en taille et en valeur des types de données et combiner ces intervalles en fonction des opérateurs utilisés dans les contraintes complexes.

Extension

Avec un bit de codage supplémentaire, il est possible spécifier si la valeur fait partie de la première version du protocole ou d'une autre.

De ce fait, toutes les contraintes visibles extensibles et non étendues sont donc aussi optimisables. Par exemple :

Algorithme d'encodage générique à tous les types

Encodage d'une valeur entière

Une valeur entière est utilisée pour :

Il y a trois cas de figure pour l'intervalle de valeurs :

Par lisibilité de ce document, l'encodage de la valeur entière correspond à la fonction :
/*******************************************************************/
Fonction EncoderEntierPer(E : Entier) Retourner Nul Ou Caractere
/* Objet : Encode le nombre entier positif ou nul E sous forme d'une chaîne de bits. */
/*******************************************************************/
...
Fin Fonction

Valeur appartenant à [BorneMin, BorneMax]

L'intervalle [BorneMin, BorneMax] est ramené à l'intervalle [1, Borne] par translation avec Borne=BorneMax-BorneMin+1.

Voici le codage d'une telle valeur :

Valeur appartenant à [BorneMin, +Infini]

L'intervalle [BorneMin, +Infini] est ramené à l'intervalle [1, +Infini] par translation.

La valeur translatée est écrite sur un nombre variable octets en encodant la taille et avec alignement sur un octet. Par exemple 65540 se code 0x03 0x01 0x00 0x04.

Valeur appartenant à [-Infini, BorneMax]

Soit :

Valeur appartenant à [-Infini, +Infini]

La valeur est écrite sur un nombre variable octets en encodant la taille et avec alignement sur un octet. Par exemple 65540 se code 0x03 0x01 0x00 0x04.

Encodage d'un index entier

Un index Index est utilisé pour :

Voici le codage d'un tel index :

Algorithmes d'encodage spécifiques à chaque type

BIT STRING

La valeur du binaire est encodée de la manière suivante :

S'il existe une contrainte sur la taille visible de PER alors :

S'il n'existe pas de contrainte sur la taille visible de PER alors :

BOOLEAN

La valeur du booléen est encodée de la manière suivante :

Chaînes de caractères

La taille Taille de la chaîne est mesurée en caractères et non en octets dès lors que tous les caractères sont représentés sur le même nombre d'octets - UTF8 est une exception.

La taille de la chaîne de caractères est encodée de la manière suivante :

L'alphabet de la chaîne de caractères est encodée de la manière suivante :

Par exemple :

CHOIX

La valeur d'un choix est encodée de la manière suivante :

Si le choix comporte plusieurs alternatives :

La valeur du choix est ensuite encodée.

Par exemple :

EMBEDDED-PDV

Les valeurs du type Asn.1 EMBEDDED-PDV se codent comme la séquence qui la définit.

ENUMERATED

L'énuméré est encodé de la manière suivante :

EXTERNAL

Soit Taille la taille de la valeur comptabilisée soit :

La valeur externe est encodée de la manière suivante :

INTEGER

L'entier est encodé de la manière suivante :

NULL

Le préambule n'est pas encodé. La taille n'est pas encodée. La valeur n'est pas encodée.

OBJECT IDENTIFIER

L'encodage Basic Encoding Rules (BER) est utilisé.

OCTET STRING

La valeur du binaire est encodée de la manière suivante :

S'il existe une contrainte visible de PER qui impose une taille, alors :

Les valeurs des types BMPString, GeneralString, GraphicString, IA5String, ISO646String, NumericString, PrintableString, TeletexString, UniversalString, UTF8String, VideotextString et VisibleString

Pour valeurs types GeneralizedTime et UTCTime, l'encodage Basic Encoding Rules (BER) est utilisé.

REAL

L'encodage Basic Encoding Rules (BER) est utilisé.

RELATIVE-OID

L'encodage Basic Encoding Rules (BER) est utilisé.

SEQUENCE

La valeur de la séquence est encodée de la manière suivante :

Les propriétés de la séquence sont ensuite codées par ordre de déclaration.

Si la séquence est extensible :

Par exemple :

SEQUENCE OF

La valeur de la liste ordonnée est encodée de la manière suivante :

Soit Taille la taille de la liste.

Les propriétés de la liste sont ensuite codées par ordre de déclaration.

Par exemple :

SET

La valeur de l'ensemble est encodée de la manière suivante :

Par exemple MaValeur SET{A BOOLEAN, B INTEGER, C IA5String} := {A TRUE, B 10, C ABC"} se code 1 0x01 0x0A 0 000011 0x41 0x42 0x43.

SET OF

La valeur de la liste non ordonnée est encodée comme pour le type SEQUENCE OF.

Variantes du standard Packed Encoding Rules

Les variantes du standard Packed Encoding Rules (PER) sont les suivantes :