이전에 게시되지 않은 것에 대해 놀랐습니다!
일관성 오버 헤드 바이트 스터핑 (옥수수 속) 알고리즘를 단락 바이트 스트림으로 사용된다.
프레임 마커를 선택하고 (0x00 사용) 스트림에서 0x00이 발생하는 곳마다 다음 0x00이 발생할 때까지 바이트 수로 바뀝니다 (이것을 마일스톤이라고 함). 이렇게하면 값 범위가 0..255에서 1..255로 줄어들어 0x00이 스트림의 프레임을 명확하게 구분할 수 있습니다.
이정표에서 다음 255B에 0x00이 포함되어 있지 않으면 최대 이정표 길이를 초과합니다. 알고리즘은 255B에서 '중지'되어 다른 이정표를 작성해야합니다. 이것이 '일관된 오버 헤드'입니다.
첫 번째 바이트는 첫 번째 이정표가되고 마지막 이정표는 프레임 마커까지의 바이트 수입니다.
Wikipedia의 몇 가지 예 (색칠 된 기사를 읽는 것이 가장 좋습니다) :
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
도전 과제 : 가장 짧은 프로그램에서 이것을 구현하는 것.
- 입력이 인코딩되지 않은 바이트 스트림 / 배열, 출력이 인코딩 된 바이트 스트림 / 배열
- 모든 종류의 이진 표준 입 / 출력 사용
- 최종 프레임 마커는 필요하지 않습니다
- 프로그램은 대형 배열을 반환 할 수 있습니다
- 0이 아닌 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가 있습니다 (0이 아닌 254 바이트와 0이 있음).