Basic Encoding Rules: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m ortografia
Errore nella condizione del campo length
Etichette: Modifica visuale Modifica da mobile Modifica da web per mobile
 
(22 versioni intermedie di 16 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]].
Line 10 ⟶ 12:
 
Quindi ad esempio per codificare il dato 7 come INTERO occorreranno 3 bytes:
*il primo che indica il ''Type'' (<math>INTERO = 02_{16}</math>02₁₆);
*il terzosecondo èche indica la codifica''Length'' deldi dato INTERO secondo le regole BERv (in questo caso <math>07_{16}</math>= 01₁₆);.
*il secondoterzo che indicaè la ''Length''codifica didel vdato INTERO secondo le regole BER (in questo caso = <math>01_{16}</math>07₁₆).;
 
In definitiva INTEGER 7 in BER diviene <math>020107_{16}</math>020107₁₆ dove si distinguono chiaramente T,L e V.
 
== BER e ASN.1 ==
Line 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;
Line 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:
Line 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|500pxupright=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>
Line 87 ⟶ 89:
:''CLASS'' = 00
:''P\C'' = 0
:''Tag'' = 00010
 
da cui se segue:
Line 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'' =====
Line 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'' =====
Line 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|650pxupright=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.
 
Line 145 ⟶ 147:
:In definitiva:<math>L = 78_{16}</math>
 
===== Esempio 2 di Codifica di L in ''definite form'' =====
''V'' è codificato su 1000 bytes.
 
Line 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>
 
Line 166 ⟶ 168:
 
=== Codifica di V ===
La codifica di ''V'', come è stato più volte detto, dipende taldal 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 =====
Line 176 ⟶ 178:
Infatti se l'integer è ad es. <math>100_{10}</math> allora si ha: <math>valore =100_{10} \to V = 100_{10} = 64_{16} = 01100100_2</math>. In questo caso il ''bit segno'' è zero e quindi la codifica è corretta.
 
Se invece l'integer è ad es. 250 allora si ha: <math>V = 250_{10} = FA_{16} = 11111010_2</math>. In questo caso il ''bit segno'' è 1 e quindi in fase di decodifica rappresenterebbe un numero negativo, vanno quindi aggiunti gli zeri in testa. In definitiva <math>valore =250 \to V = 250_{10} = FA_{16} = 00FA_{16} = 0000000011111010_2</math>. Come si puo'può notare, aggiungendo gli zeri in testa il ''bit segno'' è correttamente zero.
 
===== INTEGER Negativi =====
Line 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>
 
Line 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'' ====
Line 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]]
[[cs:Basic Encoding Rules]]
[[en:Basic Encoding Rules]]
[[es:Reglas de codificación básicas]]
[[fr:Basic Encoding Rules]]
[[pl:Basic Encoding Rules]]