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.
MaValeur BIT STRING (SIZE(1..256)) ::= '01'B
.
MaValeur BIT STRING ('01'H) ::= '01'B
.
MaValeur IA5String (FROM(A"..Z")) ::= COUCOU"
.
MonType1 ::= IA5String (A"|B"|C"|D"|E")
MonType2 ::= IA5String (B"|C")
MaValeur ::= MonType2(MonType1)
MaValeur IA5String (SIZE(1..256)) ::= coucou"
.
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
.
WITH COMPONENTS
.
WITH COMPONENTS
.
MonType1 ::= INTEGER (1|2|3|4|5)
MonType2 ::= INTEGER (2|3)
MaValeur ::= MonType2(MonType1)
MaValeur INTEGER (1..10) ::= 2
.
MaValeur INTEGER (1) ::= 1
.
MaValeur OCTET STRING (SIZE(1..256)) ::= '01'H
.
MaValeur SEQUENCE OF IA5String (SIZE(1..256)) ::= {coucou"}
.
MaValeur SET OF IA5String (SIZE(1..256)) ::= {coucou"}
.
Par exemple :
BIT STRING
MaValeur BIT STRING (SIZE(1..256)|('01'H|'02'H|'01'H)) ::= '01'H
.
IA5String
MaValeur IA5String (SIZE(1..256)|FROM(A"..Z")) ::= COUCOU"
.
INTEGER
MaValeur INTEGER (1..10)(2..20) ::= 2
.
OCTET STRING
MaValeur OCTET STRING (SIZE(1..256)|('01'H|'02'H|'01'H)) ::= '01'H
.
SEQUENCE OF
MaValeur SEQUENCE OF IA5String (SIZE(1..256)|FROM(A"..Z")) ::= {COUCOU"}
.
SET OF
MaValeur SET OF IA5String (SIZE(1..256)|FROM(A"..Z")) ::= {COUCOU"}
.
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.
De ce fait, toutes les contraintes visibles extensibles et non étendues sont donc aussi optimisables. Par exemple :
BIT STRING
MaValeur BIT STRING ('01'H|'02'H|'01'H, ...) ::= '01'H
.
IA5String
MaValeur IA5String (A"|B"|C"|D"|E", ...) ::= A"
.
INTEGER
MaValeur INTEGER (1..10, ...) ::= 2
.
OCTET STRING
MaValeur OCTET STRING ('01'H|'02'H|'01'H, ...) ::= '01'H
.
SEQUENCE OF
MaValeur SEQUENCE OF IA5String (A"|B"|C"|D"|E", ...) ::= {A"}
.
SET OF
MaValeur SET OF IA5String (A"|B"|C"|D"|E", ...) ::= {A"}
.
Type de données. | Unité de compte. |
BIT STRING | Bit. |
OCTET STRING | Octet. |
Chaîne de caractères | 1,2 ou 4 octets selon la page de codes. |
SEQUENCE OF | Nombre d'objets. |
SET OF | Nombre d'objets. |
Autres | Octet. |
INTEGER
dans un intervalle.
Il y a trois cas de figure pour l'intervalle de valeurs :
[BorneMin, BorneMax]
.
[BorneMin, +Infini]
.
[-Infini, BorneMax]
.
[-Infini, +Infini]
.
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
[BorneMin, BorneMax]
est ramené à l'intervalle [1, Borne]
par translation avec Borne=BorneMax-BorneMin+1
.
Voici le codage d'une telle valeur :
Borne==1
, aucun codage.
Borne>=2 Et Borne<=255
alors la valeur translatée est écrite sur le nombre de bits minimal nécessaire sans coder la taille et sans alignement sur un octet.MaValeur INTEGER(1..10)=3
nécessite 4 bits et se code 0011
.
Borne==256
alors la valeur translatée est écrite sur un octet sans coder la taille et avec alignement sur un octet.0xFF
.
Borne>=257 Et Borne<=65536
alors la valeur translatée est écrite sur deux octets sans coder la taille et avec alignement sur un octet.0x01 0x03
.
Borne>=65537
alors :
/*******************************************************************/
Fonction EncoderEntierAutreQueTaillePer(E : Entier) Retourner Nul Ou Caractere
/* Objet : Encode le nombre entier positif ou nul E sous forme d'une chaîne de bits. */
/*******************************************************************/
Variable
Resultat : Nul Ou Caractere;
E1 : Entier;
E2 : Entier;
Debut
Resultat=";
E1=E/16384;
E2=E%16384;
TantQue E1>0 Faire
Selon E1 Faire
Cas Pour 1 Faire
Resultat+=11000001";
E1-=4;
Fin Cas
Cas Pour 2 Faire
Resultat+=11000010";
E1-=4;
Fin Cas
Cas Pour 3 Faire
Resultat+=11000011";
E1-=4;
Fin Cas
Default
Resultat+=11000100";
E1-=4;
Fin Default
Fin Selon
Fin TantQue
Si E2<=127 Alors
Resultat+=0"+Binaire(E2,6);
Sinon
Resultat+=10"+Binaire(E2,14);
Retourner Resultat;
Fin Fonction
Par exemple 98311=(4+2)*65536+7 se code 1100 0100 1100 0010 0 000111
.
0x03 0x01 0x00 0x04
.
[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
dans l'intervalle [-BorneMax, +Infini]
.
Valeur
dans l'intervalle [-Infini, +Infini]
.
0x03 0x01 0x00 0x04
.
Voici le codage d'un tel index :
Index>=0 Et Index<=63
, la valeur translatée est codée sur sept bits 0xx xxxx
sans alignement sur un octet.000 1010
.
Index>=64
, la valeur translatée est codée sur un nombre variable de bits avec le préfixe d'un bit1
sans alignement sur un octet.1 0x03 0x01 0x00 0x04
.
0
.
1
.
S'il existe une contrainte sur la taille visible de PER alors :
0
.
Taille<16
alors la valeur est écrite sans coder la taille et sans alignement sur un octet.MaValeur BIT STRING(3)='111'B
se code 0111
.
Taille>17 Et Taille<65536
alors la valeur est écrite sans coder la taille et avec alignement sur un octet.MaValeur BIT STRING(17)='1 1111 0101 0101 1111'B
se code 0 1111 1010 1010 1111 1
.
Taille>65537
alors appel de EncoderEntierAutreQueTaillePer(Taille);
puis écriture des octets et avec alignement sur un octet.MaValeur BIT STRING(65543)='0101 0101 0101 ... 0101 0101'B
se code 0 1100 0100 0 000111 0101 ... 0101'
.
EncoderEntierPer(Taille);
puis écriture des octets et avec alignement sur un octet.MaValeur BIT STRING(1..10)='11'B
se code 0 0010 11
.
1
.
MaValeur BIT STRING='111'B
se code 1 0x01 0x03 111
.
TRUE
.1
.
FALSE
.0
.
La taille de la chaîne de caractères est encodée de la manière suivante :
0
.
1
.
EncoderEntierAutreQueTaillePer(Taille);
.
L'alphabet de la chaîne de caractères est encodée de la manière suivante :
EncoderEntierPer(Index(Valeur));
.
Par exemple :
MonType ::= IA5String(SIZE(3)^FROM(ABCD"))
nécessite 2 bits.MaValeur MonType ::= AAC"
se code 00 00 10
.
MaValeur MonType ::= DBB"
se code 10 01 01
.
MonType ::= IA5String(SIZE(1..10)^FROM(ABCD"))
nécessite 2 bits.MaValeur MonType ::= AAC"
se code 0011 00 00 10
.
MaValeur MonType ::= DBBA"
se code 0100 10 01 01 00
.
MonType ::= IA5String(SIZE(1..10, ...)^FROM(ABCD"))
nécessite 2 bits.MaValeur MonType ::= AAC"
se code 0 0011 00 00 10
.
MaValeur MonType ::= DBBA"
se code 0 0100 10 01 01 00
.
MaValeur IA5String(SIZE(3)) ::= ABC"
se code 0x41 0x42 0x43
.
MaValeur IA5String(SIZE(1..10)) ::= ABC"
se code 0011 0x41 0x42 0x43
.
MaValeur IA5String(SIZE(1..10, ...)) ::= ABC"
se code 0 0011 0x41 0x42 0x43
.
MonType ::= IA5String(FROM(ABCD"))
nécessite 2 bits.MaValeur MonType ::= AAC"
se code 0 000011 00 00 10
.
MaValeur MonType ::= DBBAAC"
se code 0 000110 10 01 01 00 00 10
.
MaValeur IA5String ::= ABC"
se code 0 000011 0x41 0x42 0x43
.
0
.
1
.
Si le choix comporte plusieurs alternatives :
UNIVERSAL
, APPLICATION
, contextuel puis PRIVATE
.
CHOIX
, le type du premier choix est retenu pour le tri.
EncoderEntierPer(Index(Choix));
.UNIVERSAL
, APPLICATION
, contextuel puis PRIVATE
.
CHOIX
, le type du premier choix est retenu pour le tri.
EncoderEntierPer(Index(Choix));
.La valeur du choix est ensuite encodée.
Par exemple :
MaValeur CHOICE{A BOOLEAN, B INTEGER, C IA5String} := C :ABC"
se code 0 000011 0 000011 0x41 0x42 0x43
.
MaValeur CHOICE{A BOOLEAN, B INTEGER, C IA5String, ...} := C :ABC"
se code 0 0 000011 0 000011 0x41 0x42 0x43
.
MaValeur CHOICE{A BOOLEAN, ..., B INTEGER, C IA5String} := C :ABC"
se code 1 0 000010 0 000011 0x41 0x42 0x43
.
EMBEDDED-PDV
se codent comme la séquence qui la définit.
EncoderEntierPer(Index(Valeur));
.MaValeur ENUMERATED {rouge(20), vert(10), bleu(30)}
nécessite 2 bits.rouge
se code 01
.
vert
se code 00
.
bleu
se code 10
.
0
.
MaValeur ENUMERATED {rouge(20), vert(10), bleu(30), ...}=rouge
se code 0 01
.1
.
EncoderEntierAutreQueTaillePer(Valeur);
.MaValeur ENUMERATED {rouge(20), vert(10), bleu(30), ..., noir(40)}=noir
se code 1 0 000100
.single-ASN1-type octet-aligned
.
arbitrary
.
La valeur externe est encodée de la manière suivante :
EncoderEntierPer(Taille);
.
0
.
EncoderEntierPer(Valeur);
.MaValeur INTEGER(1..10, ...)=3
nécessite 4 bits et se code 0 0011
.
1
.
EncoderEntierBer(Valeur);
.MaValeur INTEGER(1..10, ...)=12
se code 1 0x01 0x0C
.
EncoderEntierPer(Valeur);
.MaValeur INTEGER(1..10)=3
nécessite 4 bits et se code 0011
.
0
.
1
.
S'il existe une contrainte visible de PER qui impose une taille, alors :
Taille<16
alors la valeur est écrite sans coder la taille.MaValeur OCTET STRING(3)='123456'H
se code 0x12 0x34 0x56
.
Taille>17 Et Taille<65536
alors la valeur est écrite sans coder la taille.MaValeur OCTET STRING(17)='0123456789ABCDEF0'H
se code 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF 0x0
.
Taille>65537
alors appel de EncoderEntierAutreQueTaillePer(Taille);
puis écriture des octets.MaValeur OCTET STRING(65540)='AB AB ... AB AB'H
se code 1100 0100 0 00100 0xAB ... 0xAB
.
EncoderEntierPer(Taille);
puis écriture des octets et avec alignement sur un octet.MaValeur OCTET STRING(1..10)='AB'B
se code 0001 0xAB
.
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é.
0
.
1
.
DEFAULT
ou OPTIONAL
, alors :
EncoderEntierAutreQueTaillePer(NbValeurs);
.
1
.DEFAULT
, cela est uniquement possible pour les types construits i.e. choix, ensemble, liste ou séquence.
0
.
DEFAULT
ou OPTIONAL
, alors il n'y a pas de préambule.
Les propriétés de la séquence sont ensuite codées par ordre de déclaration.
Si la séquence est extensible :
EncoderEntierAutreQueTaillePer(NbVersions-1);
.
1
.0
.
[[ ... ]]
, celles-ci sont encodées comme une pseudo-séquence.
Par exemple :
MaValeur SEQUENCE{A BOOLEAN, B INTEGER, C IA5String} := {A TRUE, B 10, C ABC"}
se code 1 0x01 0x0A 0 000011 0x41 0x42 0x43
.
MaValeur SEQUENCE{A BOOLEAN, B INTEGER, C IA5String, ...} := {A TRUE, B 10, C ABC"}
se code 0 1 0x01 0x0A 0 000011 0x41 0x42 0x43
.
MaValeur SEQUENCE{A BOOLEAN, B INTEGER DEFAUT 20, C IA5String OPTIONAL} := {A TRUE, B 10, C ABC"}
se code 0 000010 1 1 1 0x01 0x0A 0 000011 0x41 0x42 0x43
.
MaValeur SEQUENCE{A BOOLEAN, B INTEGER DEFAUT 20, C IA5String OPTIONAL} := {A TRUE, C ABC"}
se code 0 000010 0 1 1 000011 0x41 0x42 0x43
.
MaValeur SEQUENCE{A BOOLEAN, ..., B INTEGER DEFAUT 20, C IA5String OPTIONAL} := {A TRUE, B 10, C ABC"}
se code 1 1 0 000010 1 1 0 000001 1 0x01 0x0A 0 000001 1 0 000011 0x41 0x42 0x43
.
MaValeur SEQUENCE{A BOOLEAN, ..., [[B INTEGER DEFAUT 20, C IA5String OPTIONAL]]} := {A TRUE, B 10, C ABC"}
se code 1 1 0 000001 1 000010 1 1 0x01 0x0A 0 000011 0x41 0x42 0x43
.
0
.
1
.
Soit Taille la taille de la liste.
EncoderEntierPer(Taille);
Les propriétés de la liste sont ensuite codées par ordre de déclaration.
Par exemple :
MaValeur SEQUENCE(3) OF BOOLEAN := {TRUE, TRUE, FALSE}
se code 1 1 0
.
MaValeur SEQUENCE(1..3) OF BOOLEAN := {TRUE, FALSE}
se code 10 1 0
.
MaValeur SEQUENCE OF BOOLEAN := {TRUE, TRUE, FALSE}
se code 0 000011 1 1 0
.
MaValeur SEQUENCE(3, ...) OF BOOLEAN := {TRUE, TRUE, FALSE}
se code 0 1 1 0
.
MaValeur SEQUENCE(1..3, ...) OF BOOLEAN := {TRUE, FALSE}
se code 0 10 1 0
.
MaValeur SEQUENCE(1..3, ...) OF BOOLEAN := {TRUE, FALSE, TRUE, FALSE}
se code 1 0 000100 1 0 1 0
.
UNIVERSAL
, APPLICATION
, contextuel puis PRIVATE
.
CHOIX
, le type du premier choix est retenu pour le tri.
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
.
SEQUENCE OF
.
GeneralizedTime
et UTCTime
utilisent l'encodage encodage Distinguished Encoding Rules (DER) et non encodage Basic Encoding Rules (BER).(FROM(0..0x7F))
.
SET OF
- sont classés avec le tri canonique avant d'être encodés.
Le mode canonique a la particularité de ne permettre qu'un seul choix d'encodage pour chaque typologie de valeurs.