Я удивлен, что это не было отправлено раньше!
Последовательные Накладные Байт Набивка алгоритм (COBS) используются для разделения потоков байт.
Мы выбираем маркер кадра (мы будем использовать 0x00), и, где 0x00 встречается в потоке, он заменяется количеством байтов до следующего 0x00 (мы будем называть это этапом). Это уменьшает диапазон значений с 0..255 до 1..255, позволяя 0x00 однозначно разграничивать кадры в потоке.
На вехе, если следующие 255B не содержат 0x00, это превышает максимальную длину вехи - алгоритм должен «остановиться» на 255B и поставить другую веху. Это «постоянные накладные расходы».
Первый байт будет первым этапом, последним этапом будет количество байтов до маркера кадра.
Некоторые примеры из Википедии (лучше всего прочитать статью, где они окрашены):
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
Задача: реализовать это в самой короткой программе.
- Входные данные представляют собой некодированный поток байтов / массив, выходные данные представляют собой закодированный поток байтов / массив.
- Используйте любой вид двоичного стандартного ввода / вывода
- Финальный маркер кадра не нужен
- Программа может вернуть негабаритный массив
- Поток, заканчивающийся 254 ненулевыми байтами, не требует завершающего 0x00
Ноты
- Длина возврата в худшем случае
numBytes + (numBytes / 254) + 1
пример
У нас есть байтовый массив
[0] 0x01
[1] 0x02
[2] 0x00
[3] 0x03
[4] 0x04
[5] 0x05
[6] 0x00
[7] 0x06
Для каждого 0x00
мы должны указать (в вехе), где 0x00
будет следующий .
[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
а 01
в девятом два s (где 254 ненулевых байта, за которыми следует ноль).