Come dovrei interpretare lo standard ASN.1 BER per i reali?
-
12-11-2019 - |
Domanda
stavo leggendo
- X.690 "Tecnologia dell'informazione - ASN.1 Regole di codifica: specifica delle regole di codifica di base (BER), regole di codifica canonica (CER) e regole di codifica distinta (DER)"
In particolare, §8.5.6.4 (d), per quanto riguarda una codifica binaria di valori reali con una mantissa e esponente a lunghezza variabile, recita come segue:
"Se i bit da 2 a 1 sono 11, Quindi il secondo contenuto ottetto codifica il numero di ottetti, X dire, (come numero binario non firmato) utilizzato per codificare il valore dell'esponente e il terzo fino al (X più 3)th (inclusi) I contenuti degli ottetti codificano il valore dell'esponente come numero binario del complemento di due; il valore di X deve essere almeno uno; I primi nove bit dell'esponente trasmesso non devono essere tutti zeri o tutti. "
Ciò è incoerente, poiché gli ottetti da "il terzo fino al (x più 3)RD"In realtà è x+1 ottetti.
Qualcuno è in grado di chiarire questa sezione?
Presumo che dovrebbe leggere neanche
"... quindi il secondo contenuto ottetto codifica uno in meno di il numero di ottetti, X dire,..."
o
"... il terzo fino al (x più 2)nd (incluso) Contenuti Otto ... "
Ed è il valore minimo di X Davvero 1, o è 0 significato 1 ottetto?
Addendum: Se qualcuno può fornirmi alcuni dati di test di valori in variazione di ber (stringhe di ottetto con i loro significati) che sarebbero utili.
Quello che ho finora è
- 09 00 = 0 (zero)
- 09 01 40 = +Inf (Infinity)
- 09 01 41 = -inf
- 09 08 03 2B 31 2E 30 65 2B 30 = "+1.0E+0" = 1.0 (decimale esatto)
- 09 05 80 Fe 55 55 55 = 1398101.25 (binario, 0x555555 * 2^-2)
Un esempio di cui non sono sicuro è:
- ? 09 06 83 00 FC 00 00 01 = 0.0625 (binario, 0x000001 * 2^-4)?
Inoltre, non sembra esserci alcuna codifica definita per NAN (non un numero).
Soluzione
Penso che questa sia solo una questione di indicizzazione.
Content Ottot #1 contiene alcune cose (tipo di codifica, bit del segno, base, fattore di scala e formato esponente).
Se il formato esponente è '11', allora l'ottetto successivo (Ottetto di contenuto #2) contiene un numero X che rappresenta il numero di ottetti utilizzati per codificare il valore dell'esponente. Il terzo ottetto di contenuto contiene parte del valore esponente. L'ultimo ottetto di contenuto è x+3.
CO1 (roba) CO2 (x) CO3 (valore esponente) ... CO [x+3
Il valore minimo per x è 1. Se x = 1 quindi CO [x+3] = CO4, il che significa che il numero minimo di ottetti di contenuto per il valore esponente è due. La rappresentazione più breve di questa forma è
CO1 CO2 CO3 CO4
Ciò significherebbe che '09 00 'non è una codifica valida della Sezione 8.5.6. Come è '09 01 04 'e '09 01 41'.
Le plus-infinity e il meno-infinito sono codificate tramite le regole della sezione 8.5.8 che non sono compatibili con le regole della Sezione 8.5.6.
Codificare zero secondo le regole della Sezione 8.5.6 va così
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)
Quindi il contenuto dell'ottetto n. 1 = 1000 0111 è 0x87
Content Ottot #2 = 0x01 (poiché il valore più piccolo di X è 1)
Contenuto Ottetto #3 = 0x00
Contenuto Ottetto #4 = 0x01
Content Ottot #3 e #4 danno un valore esponente di 1
(zero * one) ^ one = zero
Altri suggerimenti
NAN è definito in 8.5.9 accanto all'infinito e sarebbe 09 01 42
Questo
09 06 83 00 FC 00 00 01 = 0.0625 (binario, 0x000001 * 2^-4)
è secondo 8.5.7.4 d) non valido, CO2 (la x) "deve essere almeno uno". Ma ottengo anche il tuo risultato quando ignoro questi vincoli.
Meglio: 09 03 80 FC 01 = 0.0625 (binario, 0x01 * 2^-4)