possibili errori quando si trasmette un dato
anche quando si memorizza
memoria
+-----------------+
| |
00011101 -> | | -> 00010101
| |
+-----------------+
si trasmette due volte
si vede se arriva la stessa cosa due volte
raddoppio il numero dei bit
esiste un modo con un solo bit in più: parità
a⊕b = 1 se a e b sono diversi
definito come (a∧¬b) ∨ (¬a∧b)
a⊕b⊕c⊕d⊕e⊕f⊕…
vale 1 se il numero di variabili uguali a 1 è
dispari
(es. solo a vale uno, oppure solo b, c,
f)
vanno trasmessi o memorizzati 7 bit
se ne aggiunge un ottavo che è il loro ⊕
risultato: numero pari di uni complessivi
in caso di errore…
si inviano gli otto bit
fra questi il numero di uni è pari
parità su tutti gli otto bit è 0
11001111 → 11000111
si verifica un errore: un bit arriva diverso
arriva zero invece di uno, o viceversa
nel complesso, gli uni aumentano o diminuiscono di uno
da pari diventano dispari
parità su tutti gli otto bit è 1 invece di 0
parità di tutti gli otto:
no errore:
00011101 -> parita' -> 000111010 -> linea/memoria -> 000111010 -> parita' -> 0
errore:
00011101 -> parita' -> 000111010 -> linea/memoria -> 000101010 -> parita' -> 1
il bit aggiuntivo permette di rilevare un errore singolo
formula ⊕ usata due volte:
stesso sistema per rilevare errori di memorizzazione
basato su distanza di Hamming
esempio su numeri in base 4 invece di 2
invece di 0,1,2,3
si trasmette 0,3,6,9
numero in base dieci
un errore = cambiamento di +1 o -1
esempio di errore: invece di 3 arriva 4
corretti: 0,3,6,9
errati: tutti gli altri
arriva 4 ⇒ errore (rilevato)
in più…
è arrivato 4
cosa era stato inviato?
più probabile un errore di due
era stato inviato 3
il singolo errore si può correggere
i valori sono solo 0 e 1
non si possono moltiplicare
altro modo per distanziare quello che viene inviato:
aggiungere due bit invece di uno
message 1 0 0 1 0 1 1 1
| |
| |
| |
+-----%
|
V
result 1 0 1 0 1 1 1
proseguo fino alla fine
l'ultimo bit e' il codice
message 1 0 0 1 0 1 1 1
| | |
+-----------%
| | |
+-----% |
| |
V V
result 1 1 1 0 1 1 1
message 1 0 0 1 0 1 1 1
| | | |
+-----------------%
| | | |
+-----------% |
| | | |
+-----% | |
| | |
V V V
result 1 1 0 0 1 1 1
message 1 0 0 1 0 1 1 1
| | |
+-----------------%
| | |
+-----% |
| |
V V
result 1 0 0 0 1 1 1
codice 1101 per dire: primo, secondo e quarto
vari modi di vedere la stessa operazione:
la prima variante si puo' vedere anche in questo modo: si calcola il polinomio x3 + x2 + x0 dove x e' il primo bit del frammento di codice; viene 1101 se il primo bit vale 1, altrimenti 0; di questo valore si fa lo xor con il frammento di messaggio
questo formalizza CRC come un polinomio, cosa che permette la sua trattazione matematica; invece di dire "codice" si trova si dice "polinomio", perche' sono la stessa cosa: 1101 e' il polinomio x3 + x2 + x0 dove x
nota che questi codici sono 32 bit, non includono l'uno iniziale
esempio: dove si trova il crc32 in un file png: a parte l'header (8 byte), e' una sequenza di sezioni; in cui ogni sezione e' fatta di: lunghezza (4), tipo di sezione (4), dati (variabile), CRC-32 (4); la lunghezza e' della sola parte dati; il CRC-32 e' calcolato su tipo e dati