Comment devrais-je interpréter la norme ASN.1 BER pour les réelles?
-
12-11-2019 - |
Question
J'ai lu
- X.690 "Technologie de l'information - ASN.1 Règles de codage: Spécification des règles de codage de base (BER), Règles de codage canonique (CER) et des règles de codage distinguées (DER)"
En particulier, §8.5.6.4 (d), concernant un codage binaire de valeurs réelles avec une longueur variable MANTISSA et un exposant, se lit comme suit:
"Si les bits 2 à 1 ont 11,
alors le deuxième contenu d'octet code le nombre d'octets, x disons, (comme un nombre binaire non signé) Utilisé pour coder la valeur de l'exposant et la troisième à la ( x plus 3) TH (inclus) des octets encode la valeur de l'exposant comme complément de deux Numéro binaire ; la valeur de x doit être au moins une ; les neuf premiers bits de l'exposant transmis ne doivent pas être tous des zéros ou tous ceux-ci. " / p> Ceci est incompatible, comme les octets de "le troisième à la (x plus 3) [rd] " est en réalité x + 1 octets.
Est-ce que quelqu'un est capable de clarifier cette section?
Je suppose qu'il devrait lire soit
"... Puis le deuxième contenu d'octet code un de moins que le nombre d'octets, x dites, ..."
ou
"... le troisième jusqu'à la (x plus 2) nd (inclus) Contenu octets ..."
et, est la valeur minimale de x vraiment 1, ou est-ce 0 Signification 1 octet?
addendum : Si quelqu'un peut me fournir quelques données de test de valeurs codées variables (cordes d'octet avec leurs significations) qui seraient utiles.
Qu'est-ce que j'ai jusqu'à présent est
- 09 00= 0 (zéro)
- 09 01 40= + INF (Infinity)
- 09 01 41= -INF
- 09 08 03 2B 31 2E 30 65 2B 30="+ 1.0E + 0"= 1,0 (décimal exact)
- 09 05 80 Fe 55 55 55= 1398101.25 (binaire, 0x555555 * 2 ^ -2)
Un exemple je ne suis pas sûr de:
- ? 09 06 83 00 FC 00 00 01= 0,0625 (binaire, 0x000001 * 2 ^ -4)?
De plus, il semble y avoir un codage défini pour NAN (pas un nombre).
- ? 09 06 83 00 FC 00 00 01= 0,0625 (binaire, 0x000001 * 2 ^ -4)?
La solution
Je pense que ce n'est qu'une question d'indexation.
Contenu octet n ° 1 contient des éléments (type de codage, bit de signalisation, base, facteur d'échelle et format exposant).
Si le format exposant est "11", le prochain octet (Contenu octet n ° 2) contient un numéro X qui représente le nombre d'octets utilisés pour coder la valeur de l'exposant. Le troisième octet de contenu contient une partie de la valeur de l'exposant. Le dernier octet de contenu est x + 3.
CO1 (STUB) CO2 (x) CO3 (valeur d'exposition) ... CO [x + 3]
La valeur minimale pour x est 1. Si x= 1, alors co [x + 3]= CO4, ce qui signifie que le nombre minimal d'octets de contenu pour une valeur exponante est deux. La représentation la plus courte de ce formulaire est
CO1 CO2 CO3 CO4
Cela signifierait que '09 00 'n'est pas un codage valide de la section 8.5.6. Comme le 09 01 04 'et '09 01 41'.
Le plus-infini et moins-infini sont codés via les règles de la section 8.5.8 qui n'est pas compatible avec les règles de la section 8.5.6.
codage zéro par les règles de la section 8.5.6 va comme ça
CO1:8 = 1 (Content Octet #1 bit 8)
CO1:7 = x = 0 (Content Octet #1 bit 7 is dont care, but I'll use 0 for positive)
CO1:65 = 00 (Content Octet #1 bits 6 and 5 is 00 for base two)
CO1:43 = x = 01 (Content Octet #1 bits 4 and 3 is scaling factor, so we don't care but I'll make it 01 for a value of one)
CO1:21 = 11 (Content Octet #1 bits 2 and 1 is the exponent format and '11' is the format in question)
SO Content Octet # 1= 1000 0111 est 0x87
Contenu octet # 2= 0x01 (car la plus petite valeur de x est 1)
Contenu octet # 3= 0x00
Contenu octet # 4= 0x01
Contenu octets n ° 3 et n ° 4 donnent une valeur d'exposition de 1
(zéro * un) ^ un= zéro
Autres conseils
Nan est défini dans 8.5.9 à côté de l'infini et serait 09 01 42
Ceci
09 06 83 00 FC 00 00 01= 0,0625 (binaire, 0x000001 * 2 ^ -4)
est selon 8.5.7.4 D) non valide, le CO2 (X) "doit au moins être".Mais je reçois aussi votre résultat lorsque j'ignore ces contraintes.
meilleur: 09 03 80 fc 01= 0,0625 (binaire, 0x01 * 2 ^ -4)