Basic Encoding Rules: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Botcrux (discussione | contributi)
m Bot: Fix dimensionamento immagini (v. richiesta)
Errore nella condizione del campo length
Etichette: Modifica visuale Modifica da mobile Modifica da web per mobile
 
(16 versioni intermedie di 12 utenti non mostrate)
Riga 1:
{{W|informatica|ottobre 2023}}
'''Basic Encoding Rules''' (abbreviazione '''BER''') è un sistema di codifica composto da una serie di regole per la conversione di dati eterogenei in flussi di [[byte]].
 
'''Basic Encoding Rules''' (abbreviazione '''BER''') è un sistema di [[Codice (teoria dell'informazione)|codifica]] composto da una serie di regole per la conversione di dati eterogenei in flussi di [[byte]].
 
La codifica BER è strettamente legata allo standard [[ASN.1]] ed è utilizzata per le comunicazioni [[Simple Network Management Protocol|SNMP]] e [[Lightweight Directory Access Protocol|LDAP]].
Riga 11 ⟶ 13:
Quindi ad esempio per codificare il dato 7 come INTERO occorreranno 3 bytes:
*il primo che indica il ''Type'' (INTERO = 02₁₆);
*il terzo è la codifica del dato INTERO secondo le regole BER (in questo caso 07₁₆);
*il secondo che indica la ''Length'' di v (in questo caso = 01₁₆).
*il terzo è la codifica del dato INTERO secondo le regole BER (in questo caso 07₁₆);
 
In definitiva INTEGER 7 in BER diviene 020107₁₆ dove si distinguono chiaramente T,L e V.
Riga 20 ⟶ 22:
Come si può immaginare la codifica di V dipende dal tipo T.
Ci sono alcuni tipi predefiniti in ASN.1 (si dice che sono ''Tag appartenenti alla Class UNIVERSAL'').
Per maggiori informazioni a tal proposito consultare [httphttps://wwwweb.ossarchive.comorg/asn1web/20081205052919/booksintro.html] o [http://www.oss.com/asn1/booksintro.html OSS Nokalva - Books Overview].
 
== Codifica BER ==
In generale quando si deve effettuare la codifica BER di un dato si procede nenel seguente modo:
#si codifica T;
#si codifica V;
Riga 40 ⟶ 42:
==== Primo byte di T ====
Vediamo qui sotto come si presenta il primo byte di ''T'':
[[immagineFile:BERPrimobyte T.JPG|thumb|center|Primo byte di T]]
 
La codifica di ''CLASS'' segue la seguente tabella:
Riga 64 ⟶ 66:
==== Altri byte di T ====
Per codificare gli altri byte si procede nel seguente modo:
#si converte l{{' }}''ID'' in binario
#si aggiunge un '''1''' ogni 7 bit
#si completa il byte con un 10 in testa
 
NB !!! da correggereappena corretto!!! l'ultimo byte che compone l'ID viene composto con uno '0' in testa, proprio per indicare che l'ID finisce con quel byte.
 
[[immagineFile:Altribytes T.JPG|thumb|upright=2.3|center|Altri bytes di T]]
 
Ad es. se ID = 250 in base 10, allora:
#<math>250_{10} = FA_{16} = 11111010_2</math>
#<math>11111010 -> 1 '''\textbf{1'''}1111010</math>
#<math>1 '''\textbf{1'''}1111010 -> '''\textbf{1'''}0000001 '''1'''~\textbf{0}1111010</math>
 
In definitiva ID = 250 viene codificato con <math>81FA_{16}</math>
Riga 87 ⟶ 89:
:''CLASS'' = 00
:''P\C'' = 0
:''Tag'' = 00010
 
da cui se segue:
Riga 113 ⟶ 115:
==== Encoding di L 'definite length' ====
In questo tipo di encoding si distinguono 2 casi distinti:
#se <math>Len(V)<=127</math> allora ''L'' viene codificato in 1 byte (''short definite form'')
#se <math>Len(V)>=127</math> allora ''L'' viene codificato in più byte (''long definite form'')
 
===== Caso 1: ''L'' in 1 byte - ''short definite form'' =====
Riga 121 ⟶ 123:
Il limite di 127 byte è dato dal fatto che 127 è 7F in esadecimale (01111111 in binario) e quindi il primo bit di ''L'' è sicuramente zero.
 
Ciò è utile in fase di Decoding, infatti se il primo bit è zero, significa che è stata usata la codifica di L su un solo byte.
[[immagineFile:Short Defined Form L.JPG|thumb|center|L in Short Defined Form]]
 
===== Caso 2: ''L'' in più bytes - ''long definite form'' =====
Riga 134 ⟶ 136:
*aggiungendo <math>80_{16}</math> si obbliga l'ultimo bit del primo byte di L ad essere 1.
*nei primi 7 bit del primo byte di ''L'' c'è in realtà la lunghezza dei byte restanti di ''L'', infatti <math>Len(Len(V))+1</math> indica proprio la lunghezza di L
[[immagineFile:Long Defined Form L.JPG|thumb|upright=3|center|L in Long Defined Form]]
In fase di Decoding per capire che stiamo usando una codifica di L su più byte di tipo ''long definite form'' deve quindi essere:
*il primo bit del primo byte di ''L''= 1
*gli altri 7 bit del primo byte devono essere diversi da <math>0000000_2</math>
 
===== Esempio 1 di Codifica di L in ''definite form'' =====
''V'' è codificato su 120 bytes.
 
Riga 145 ⟶ 147:
:In definitiva:<math>L = 78_{16}</math>
 
===== Esempio 2 di Codifica di L in ''definite form'' =====
''V'' è codificato su 1000 bytes.
 
Riga 154 ⟶ 156:
#<math>Len(Len(V)) = 2_{10} = 02_{16}</math>
#''byte 1 di L '' <math>= Len(Len(V)) + 80_{16} = 82_{16} = 10000010_2</math>
#''bytes 2,3 di L '' <math>= Len(V) = 03E8_{16}</math>
In definitiva:<math>L = 8203E8_{16}</math> ed è di <math>Len(Len(V)) + 1 = 2 + 1 = 3 bytes</math>
 
Riga 166 ⟶ 168:
 
=== Codifica di V ===
La codifica di ''V'', come è stato più volte detto, dipende dal tipo ''T'' e dalla sua definizione tramite sintassi [[ASN.1]] In questa sede sarà illustrata la codifica dei 3 tipi principali: INTEGER, OCTECT STRING e OBJECT ID. Per una panoramica completa di codifica decodifica si rimanda ancora a [https://web.archive.org/web/20081205052919/http://www.oss.com/asn1/booksintro.html OSS Nokalva - Books Overview] o [https://web.archive.org/web/20081205052919/http://www.oss.com/asn1/booksintro.html] OSS Nokalva - Books Overview]
 
==== Codifica di ''INTEGER'' ====
La codifica di un dato INTEGER dipende dal suo segno. Il primo bit del primo byte codificato è detto ''bit segno''. Se questo è 0 allora il numero è positivo, altrimenti è negativo.
 
===== INTEGER Positivi =====
Riga 188 ⟶ 190:
* <math>\left |valore \right | =\left |-100 \right | = 100_{10} = 01100100_2</math> <small>(vedi es. INTEGER Positivi)</small>
* complemento a 1: <math>01100100_2 -> 10011011_2</math>
* aggiungere <math>+ 1_2</math>. Si ottineottiene <math>10011011_2 + 1_2 = 10011100_2</math>
Quindi <math>valore = -100 \to V = 10011100_2 = 9C_{16} </math>
 
Riga 198 ⟶ 200:
 
==== Codifica di ''OCTECT STRING'' ====
In ASN.1 sono definite una grande varietà di stringhe, ma l'OCTECT STRING è quella fondamentale. In questo caso ogni carattere occupa 1 byte e viene utilizzata la codifica [[ASCII]].
 
Ad esempio l' OCTECT STRING "ciao" viene codificato in 4 byte in <math>6369616F_{16}</math>
 
==== Codifica di ''OBJECT IDENTIFIER'' ====
Riga 226 ⟶ 228:
* [[Simple Network Management Protocol]]
* [[Lightweight Directory Access Protocol]]
 
== Altri progetti ==
{{interprogetto}}
 
== Collegamenti esterni ==
#* {{en}} [https://web.archive.org/web/20081205052919/http://www.oss.com/asn1/booksintro.html Olivier Dubuisson - ASN.1: Communication Between Heterogeneous Systems] - Free PDF book
#* {{en}} [https://web.archive.org/web/20081205052919/http://www.oss.com/asn1/booksintro.html Professor John Larmouth - ASN.1 Complete] - Free PDF book
 
[[Categoria:Codifica]]
 
{{Portale|Informatica}}
 
[[Categoria:Codifica]]