Je suis surpris que cela n'ait pas été publié auparavant!
L' algorithme COBS ( Overhead Byte Stuffing ) est utilisé pour délimiter les flux d'octets.
Nous choisissons un marqueur de trame (nous utiliserons 0x00) et partout où 0x00 se produit dans le flux, il est remplacé par le nombre d'octets jusqu'à ce que le prochain 0x00 se produise (nous appellerons cela un jalon). Cela réduit la plage de valeurs de 0..255 à 1..255, permettant à 0x00 de délimiter sans ambiguïté les trames dans le flux.
À un jalon, si le 255B suivant ne contient pas 0x00, cela dépasse la longueur maximale du jalon - l'algorithme doit «caler» à 255B et mettre un autre jalon. Il s'agit du «surcoût constant».
Le premier octet sera le premier jalon, le jalon final sera le nombre d'octets jusqu'au marqueur de trame.
Quelques exemples de Wikipédia (mieux lire l'article où ils sont colorés):
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
Défi: mettre cela en œuvre dans le programme le plus court.
- L'entrée est un flux / tableau d'octets non codé, la sortie est un flux / tableau d'octets codés
- Utilisez n'importe quelle sorte d'entrée / sortie standard binaire
- Le marqueur d'image final n'est pas nécessaire
- Le programme peut renvoyer un tableau surdimensionné
- Un flux se terminant par 254 octets non nuls ne nécessite pas la fin 0x00
Remarques
- La longueur de retour dans le pire des cas est
numBytes + (numBytes / 254) + 1
Exemple
Nous avons le tableau d'octets
[0] 0x01
[1] 0x02
[2] 0x00
[3] 0x03
[4] 0x04
[5] 0x05
[6] 0x00
[7] 0x06
Pour chacun, 0x00
nous devons indiquer (dans un jalon) où 0x00
aurait été le suivant.
[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
mais il y a deux 01
s dans le neuvième (où il y a 254 octets non nuls suivis d'un zéro).