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'' (
*il
*il
In definitiva INTEGER 7 in BER diviene
== 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 [
== Codifica BER ==
In generale quando si deve effettuare la codifica BER di un dato si procede
#si codifica T;
#si codifica V;
Line 40 ⟶ 42:
==== Primo byte di T ====
Vediamo qui sotto come si presenta il 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{{'
#si aggiunge un '''1''' ogni 7 bit
#si completa il byte con un
NB !!!
[[
Ad es. se ID = 250 in base 10, allora:
#<math>250_{10} = FA_{16} = 11111010_2</math>
#<math>11111010 -> 1
#<math>1
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)>
===== 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.
[[
===== 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
[[
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
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
==== 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
===== 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
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
Ad esempio l'
==== Codifica di ''OBJECT IDENTIFIER'' ====
Line 226 ⟶ 228:
* [[Simple Network Management Protocol]]
* [[Lightweight Directory Access Protocol]]
== Altri progetti ==
{{interprogetto}}
== Collegamenti esterni ==
[[Categoria:Codifica]]▼
{{Portale|Informatica}}
▲[[Categoria:Codifica]]
|