Tôi ngạc nhiên điều này đã không được đăng trước đó!
Thuật toán nhất quán Overte Byte Stuffing (COBS) được sử dụng để phân định các luồng byte.
Chúng tôi chọn điểm đánh dấu khung (chúng tôi sẽ sử dụng 0x00) và bất cứ nơi nào 0x00 xảy ra trong luồng, nó sẽ được thay thế bằng số byte cho đến khi 0x00 tiếp theo xảy ra (chúng tôi sẽ gọi đây là cột mốc). Điều này làm giảm phạm vi của các giá trị từ 0..255 xuống 1..255, cho phép 0x00 phân định rõ ràng các khung trong luồng.
Tại một cột mốc, nếu 255B tiếp theo không chứa 0x00 thì điều này vượt quá độ dài cột mốc tối đa - thuật toán phải 'dừng lại' ở 255B và đặt một cột mốc khác. Đây là "chi phí nhất quán".
Byte đầu tiên sẽ là cột mốc đầu tiên, cột mốc cuối cùng sẽ là số byte cho đến khi đánh dấu khung.
Một số ví dụ từ Wikipedia (tốt nhất để đọc bài viết có màu):
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
Thách thức: để thực hiện điều này trong chương trình ngắn nhất.
- Đầu vào là một luồng / mảng byte chưa được mã hóa, đầu ra là một luồng / mảng byte được mã hóa
- Sử dụng bất kỳ loại đầu vào / đầu ra tiêu chuẩn nhị phân
- Điểm đánh dấu khung cuối cùng là không cần thiết
- Chương trình có thể trả về một mảng quá khổ
- Luồng kết thúc với 254 byte khác không không yêu cầu 0x00 trailing
Ghi chú
- Thời gian hoàn trả trong trường hợp xấu nhất là
numBytes + (numBytes / 254) + 1
Thí dụ
Chúng ta có mảng byte
[0] 0x01
[1] 0x02
[2] 0x00
[3] 0x03
[4] 0x04
[5] 0x05
[6] 0x00
[7] 0x06
Đối với mỗi 0x00
chúng ta cần nêu (trong một cột mốc), nơi tiếp theo 0x00
sẽ có.
[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
nhưng có hai 01
s trong số thứ chín (trong đó có 254 byte khác không theo sau là 0).