ฉันประหลาดใจที่นี่ยังไม่ได้โพสต์ก่อน!
โสหุ้ยไบต์บรรจุสอดคล้องอัลกอริทึม (ซัง) จะใช้ในการกำหนดเขตลำธารไบต์
เราเลือกเครื่องหมายเฟรม (เราจะใช้ 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
ถาม:จะใช้สิ่งนี้ในโปรแกรมที่สั้นที่สุด
- อินพุตเป็นสตรีม / อาร์เรย์ที่ไม่มีการเข้ารหัสไบต์เอาต์พุตคือสตรีม / อาร์เรย์ที่เข้ารหัสแล้ว
- ใช้อินพุต / เอาต์พุตมาตรฐานไบนารีประเภทใดก็ได้
- เครื่องหมายเฟรมสุดท้ายไม่จำเป็น
- โปรแกรมสามารถส่งคืนอาร์เรย์ที่มีขนาดใหญ่
- สตรีมที่ลงท้ายด้วย 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 ไบต์ไม่ใช่ศูนย์ตามด้วยศูนย์)