Sono sorpreso che questo non sia mai stato pubblicato prima!
L' algoritmo COBS ( Consistent Overhead Byte Stuffing ) viene utilizzato per delimitare i flussi di byte.
Scegliamo un marker di frame (useremo 0x00) e ogni volta che si verifica 0x00 nel flusso, questo viene sostituito con il numero di byte fino a quando si verifica il successivo 0x00 (lo chiameremo una pietra miliare). Ciò riduce l'intervallo di valori da 0..255 a 1..255, consentendo a 0x00 di delimitare in modo inequivocabile i frame nel flusso.
A un traguardo, se il prossimo 255B non contiene 0x00, questo supera la lunghezza massima del traguardo: l'algoritmo deve "bloccarsi" a 255B e inserire un altro traguardo. Questo è il "sovraccarico coerente".
Il primo byte sarà il primo traguardo, il traguardo finale sarà il numero di byte fino al marker del frame.
Alcuni esempi da Wikipedia (meglio leggere l'articolo in cui sono colorati):
0x00 as frame marker
Unencoded data (hex) Encoded with COBS (hex)
00 01 01 00
00 00 01 01 01 00
11 22 00 33 03 11 22 02 33 00
11 22 33 44 05 11 22 33 44 00
11 00 00 00 02 11 01 01 01 00
01 02 03 ... FD FE FF 01 02 03 ... FD FE 00
00 01 02 ... FC FD FE 01 FF 01 02 ... FC FD FE 00
01 02 03 ... FD FE FF FF 01 02 03 ... FD FE 02 FF 00
02 03 04 ... FE FF 00 FF 02 03 04 ... FE FF 01 01 00
03 04 05 ... FF 00 01 FE 03 04 05 ... FF 02 01 00
Sfida: implementare questo nel programma più breve.
- L'input è un flusso / array di byte non codificato, l'output è un flusso / array di byte codificato
- Utilizzare qualsiasi tipo di input / output standard binario
- Il marker finale del frame non è necessario
- Il programma può restituire un array sovradimensionato
- Un flusso che termina con 254 byte diversi da zero non richiede il trascinamento 0x00
Appunti
- La lunghezza di ritorno nel caso peggiore è
numBytes + (numBytes / 254) + 1
Esempio
Abbiamo l'array di byte
[0] 0x01
[1] 0x02
[2] 0x00
[3] 0x03
[4] 0x04
[5] 0x05
[6] 0x00
[7] 0x06
Per ognuno di 0x00
noi dobbiamo indicare (in una pietra miliare) dove 0x00
sarebbe stato il prossimo .
[0] 0x03 #Milestone. Refers to the original [2] - "The next 0x00 is in 3B"
[1] 0x01 #Original [0]
[2] 0x02 #Original [1]
[3] 0x04 #Milestone. Refers to the original [6] - "The next 0x00 is in 4B"
[4] 0x03 #
[5] 0x04 #
[6] 0x05 # Originals [3..5]
[7] 0x02 #Milestone. Refers to the end frame marker
[8] 0x06 #Original [7]
[9] 0x00 #Optional. End frame marker.
01
ma ci sono due 01
s nel nono (dove ci sono 254 byte diversi da zero seguiti da uno zero).