본문 바로가기
지속가능티끌/Data.Math.Phys

COBS . 바이트 시리즈 프레이밍 . 언어별 라이브러리 추천

by i.got.it 2026. 6. 16.

 

 

COBS . Consistent Overhead Byte Stuffing 

- 바이트 시리즈의 프레이밍 알고리듬 중의 하나 . 

- - 예 : 시리얼 통신 경로로 N 바이트 단위로 송신하려는 경우 COBS 인코딩하여 끝에 delimiter ( 0) 송신하고 이를 수신한 측에서 COBS decoding 하면 송신측에서 의도한 N 바이트 구간을 추출가능하다.  

 

-  COBS encoding 프레임들의 경계 지점에만  delimiter (통상 0 으로 함) 값이 등장하게되고 원본 데이터에 있던 0의 값들이 있던 자리에는 다음 0까지의 오프셋을 기록하므로 프레임의 경계 지점에만 0인 값이 단 1개 존재한다. 수신측에서는 프레임 경계지점 값이 0인 것 탐색하여 COBS encoding 된 영역만 추출하여 COBS decoding 하여 원본 데이터를 복원한다.  

 

 

COBS encoding 규칙  및 예시 

 

 

 

위 도식의 예에서는 원본데이터에 0이 1개 만 있는데 , 0이 1개 이상인 원본 데이터 예  1,2,0,3,4,0,5  라고 하고 아래 처럼 이해 하면 쉽다. 

COBS encoding 끝자리에는 0을 기록한다. 첫 자리에는 원본데이터에서 처음 등장하는 0 의 오프셋( 본 예에서는 3 )을 기록하고 데이터 중의 0 이 있는 자리에는 다음 0이 나오는 오프셋으로 기록해둔다. 원본 데이터에서 마지막 0 자리에는 끝자리에 기록해둔 0까지의 오프셋(본 예에서는 2)을 기록한다. 

최종 COBS 인코딩 바이트열 :     3,1,2,3,3,4,2,5,0  

핵심 : COBS 인코딩된 바이열에서 0은 프레임 경계 지점에만 등장한다. 

 

 

COBS encoding 최대 바이트 증가량 

 

 

 

원본 데이터 N 바이트를 COBS 인코딩 후 델리미터(0x00)까지 포함한 최종 크기는 최대 N + 2 + (int)(N/254) 바이트가 된다.

예시.

- N=254바이트 이하일 때는 최대 2바이트가 증가하여 총 257, N=255 이면 3바이트 증가하여 총 258

- N=4096 이면, 4096 + 2 + 16 이므로 총 4,114바이트

 


 

원본 데이터 수량제한 없음 

COBS 알고리즘 자체로는 원본 데이터의 크기(수량) 제한이 없다.

오프셋 값을 1바이트(0x01~0xFF)로 표현하므로 다음 0까지의 거리가 최대 254칸으로 제한될 뿐이다. 연속된 데이터가 254바이트를 넘어가면 0이 없더라도 강제로 오프셋 '255'(0xFF)를 삽입하여 처리하기 때문에, 원본 데이터가 아무리 길어도 이론상 모두 인코딩할 수 있다.

 

 

예시: 260바이트 데이터 인코딩 시 실제 구조

예를 들어 0x00이 하나도 없는 0x01, 0x02, ..., 0x01 형태의 260바이트 원시 데이터가 있다고 가정해보자. 

[원시 데이터 (260바이트)]
[0x01, 0x02, ... (254바이트 데이터) ..., 0x03, 0x04, ... (6바이트 데이터)]

 

이를 cobs 인코딩 하면 262바이트의 단일 블록이 만들어진다. 

 

[COBS 인코딩 완료된 결과물 (262바이트)]
  |
  v 
[255] [0x01, 0x02, ... 254바이트 데이터 ...] [7] [0x03, 0x04, ... 6바이트 데이터 ...]

 

  1. 맨 첫 바이트 [255]: 수신 측에 "다음 오프셋은 255바이트 뒤에 있다"고 알려준다. 
  2. 254바이트 데이터가 그대로 나열.
  3. 중간 오프셋 바이트 [7]: 수신 측은 255번째 위치에서 이 [7]을 만난다.  255라는 값은 원래 데이터에 0x00이 없었어도 강제로 삽입된 것이므로, 수신 측은 원래 데이터에 0x00을 복원하지 않고 "다음 0x00 위치는 7바이트 뒤에 있구나" 하고 계속 읽어 나간다.
  4. 남은 6바이트 데이터가 나열.
최종적으로 이 262바이트 뒤에 패킷 구분자 0x00을 붙여서 총 263바이트짜리 프레임 1개로 전송한다. 
 

 

 

 

 

COBS  라이브러리 

cobs-c

- 프레임 전체 블럭 단위로만 처리 가능. 바이트 스트림 방식 지원안됨. 

 

GitHub - cmcqueen/cobs-c: Consistent Overhead Byte Stuffing — C implementation

Consistent Overhead Byte Stuffing — C implementation - cmcqueen/cobs-c

github.com

 

 

nano cobs 

- Incremental Encoding/Decofing 을 목표로 구현된것. 즉 바이트 스트림 지원됨. 

- 바이트 스트림외에  프레임 전체블럭 단위 처리하는 함수도 구현되어있다. 

- 상기 cobs-c 보다 월등히 유용함. 

 

GitHub - charlesnicholson/nanocobs: A C99 implementation of the Consistent Overhead Byte Stuffing ("COBS") algorithm.

A C99 implementation of the Consistent Overhead Byte Stuffing ("COBS") algorithm. - charlesnicholson/nanocobs

github.com

 

 

- 바이트 스트림 의도했으나 상기 nano cobs 가 더 쉬워보임. 

 

GitHub - grandcentrix/cobs: This is a C implementation of Consistent Overhead Byte Stuffing.

This is a C implementation of Consistent Overhead Byte Stuffing. - grandcentrix/cobs

github.com

 

 

 

 

Zephyr RTOS 내장 COBS 

 

Zephyr . COBS 라이브러리

Zephyr 내장 COBS 라이브러리 - COBS 기본개념 : https://igotit.tistory.com/6611 헤더 경로: #include 주요 함수: cobs_encode(), cobs_decode() 특징: Zephyr 전용 네트워크 버퍼 구조체인 struct net_buf를 기반으로 동작하며,

igotit.tistory.com

 

 

파이썬 cobs 라이브러리 

 

파이썬에서 cobs 구현예 : https://igotit.tistory.com/6694 의 com 포트 송신 코드 2

 

파이썬 . 시리얼 com 포트 통신 . PySerial

파이썬 . 시리얼 com 포트 통신 PySerial 설치 - 내부적으로 Win32 API 이용 - 설치 : pip install PySerial 주요 구현 개념 Baud Rate USB CDC 로 인식된 com 포트의 경우 Baud Rate 설정값은 통신속도를 제한하지 않는

igotit.tistory.com

 

 

안드로이드 라이브러리 

 

 

📱 안드로이드(Java/Kotlin)용 COBS 라이브러리 Top 3
  1. themarpe/cobs-java (Java)
    • 특징: COBS의 표준 격인 cmcqueen/cobs-c 라이브러리를 자바로 그대로 포팅한 오픈소스.
    • 장점: 원본 C 라이브러리와의 호환성이 가장 뛰어나며 구현이 직관적이라 안드로이드 Java/Kotlin 프로젝트 모두에서 매우 안정적으로 작동. [1]
  2. FabD86/cobs-kotlin (Kotlin)
    • 특징: 코틀린(Kotlin) 환경에 맞추어 깔끔하게 작성된 전용 COBS 구현체.
    • 장점: 최근 안드로이드 스튜디오의 기본 언어 트렌드인 코틀린의 확장 함수나 문법적 이점을 살려 개발할 수 있어, 최신 모던 안드로이드 앱 개발자들에게 접근성이 높다. [1]
  3. agrommek/COBS (Java)
    • 특징: 스트림(Stream) 및 버퍼(Buffer) 기반의 메시지 처리를 염두에 두고 정밀하게 설계된 자바용 COBS 라이브러리.
    • 장점: 시리얼 통신(UART/RS-232)이나 TCP 소켓 통신을 통해 안드로이드 장비와 임베디드 보드를 연동하는 실무 환경에서 구분자 처리를 안정적으로 수행..

 

📱 nanocobs 기반 및 안드로이드 스트림 최적화 COBS 라이브러리 Top 3
  1. j-b-s / cobs-java (nanocobs 사상 부합 / Java·Kotlin 공용)
    • 특징: 기존 cobs-c 방식의 한계를 극복하기 위해 자바의 InputStream / OutputStream 구조에 맞추어 인크리멘탈(스트림) 방식으로 구현된 라이브러리.
    • 추천 이유: nanocobs가 추구하는 "메모리 오버헤드 제로" 및 "청크 단위 스트리밍 패킷 처리" 개념과 가장 잘 맞음. 안드로이드 소켓이나 USB 시리얼 포트에서 바이트가 들어오는 대로 실시간 디코딩(온더플라이)하기에 최적.
  2. Android NDK 기반 nanocobs 직접 연동 (C/C++ → Java/Kotlin JNI)
    • 특징: 안드로이드 스튜디오에서 nanocobs C 코드를 그대로 가져와 NDK(JNI)로 빌드하여 사용하는 방식.
    • 추천 이유: nanocobs의 최대 장점인 In-place(추가 메모리 할당 없는) 연산 및 극한의 C99 최적화 성능을 안드로이드 앱 계층에서 100% 그대로 누릴 수 있는 유일한 방법.  성능과 신뢰도가 가장 확실하며, 대용량 바이너리 스트림을 다룰 때 가비지 컬렉터(GC) 부하가 전혀 없다. .
  3. RBus / cobs-java (임베디드 버스 연동 특화)
    • 특징: 고신뢰성 차량용·산업용 통신 프레임워크(RBus)의 자바 서브 프로젝트로 개발된 COBS 모듈..
    • 추천 이유: nanocobs가 설계된 배경(바이트 탈락이 잦은 불안정한 커뮤니케이션 버스 환경)과 동일한 목적을 가집니다. 연속된 스트림 데이터 속에서 패킷 경계(0x00)를 정밀하게 파싱하고 유효성을 검증하는 인크리멘탈 구조가 탄탄하게 구현되어 있다. 

 

 


첫 등록 : 2026.06.16

최종 수정 : 2026.08.04

단축 주소 : https://igotit.tistory.com/6611


 

댓글



비트코인




            암호화폐/외환/나스닥/골드          
       
현물 |선물 인버스 |선물 USDT , bybit MT5               프랍 트레이딩. MT4,MT5