Estou surpreso que isso não tenha sido publicado antes!
O algoritmo COBS ( Overhead Byte Overhead Consistente ) é usado para delimitar fluxos de bytes.
Escolhemos um marcador de quadro (usaremos 0x00) e, sempre que 0x00 ocorre no fluxo, ele é substituído pelo número de bytes até o próximo 0x00 (chamaremos isso de marco). Isso reduz o intervalo de valores de 0..255 a 1..255, permitindo que 0x00 delimite inequivocamente os quadros no fluxo.
Em um marco, se o próximo 255B não contiver 0x00, isso excede o comprimento máximo do marco - o algoritmo deve 'parar' em 255B e colocar outro marco. Essa é a "sobrecarga consistente".
O primeiro byte será o primeiro marco, o marco final será o número de bytes até o marcador do quadro.
Alguns exemplos da Wikipedia (melhor ler o artigo em que são coloridos):
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
Desafio: implementar isso no programa mais curto.
- A entrada é um fluxo / matriz de bytes não codificados, a saída é um fluxo / matriz de bytes codificados
- Use qualquer tipo de entrada / saída padrão binária
- O marcador de quadro final não é necessário
- O programa pode retornar uma matriz de grandes dimensões
- Um fluxo que termina com 254 bytes diferentes de zero não requer o 0x00 à direita
Notas
- O pior retorno do comprimento é
numBytes + (numBytes / 254) + 1
Exemplo
Temos a matriz de bytes
[0] 0x01
[1] 0x02
[2] 0x00
[3] 0x03
[4] 0x04
[5] 0x05
[6] 0x00
[7] 0x06
Para cada um 0x00
, precisamos declarar (em um marco) onde o próximo 0x00
teria sido.
[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
mas há dois 01
s no nono (onde existem 254 bytes diferentes de zero seguidos de um zero).