2012-02-08 2 views
6

직렬 통신 채널을 통해 전송 및 수신되는 메시지 집합을 정의하는 문서가 전달되었습니다. 들어오는 메시지를 가져 와서 개체로 deserialize하고 아웃 바운드 메시지를 serialize하는 것이 좋습니다. 와이어를 통해 인코딩은 설립 변경할 수없는, 그리고 예를 들어, 헤더에 다양한 비트 필드와 다양한 페이로드로 구성, 비트 필드 직렬화 및 비 직렬화

class Message{ 
int msg_num : 7 
int dest_addr : 4 
bool SRR : 1 
bool IDE : 1 
int source_addr : 6 
//... and so on... 
} 

내가 protobufs를 사용하여 살펴했다,하지만 인코딩 자신의 varint 방법이라고 나타납니다 설립. 나는 또한 boost-serialization을 보았습니다. 그러나 지금까지 읽은 내용을 토대로 인코딩이 어떻게 이루어 졌는지 완전히 명확하지 않습니다. 그래서

, 몇 가지 질문이 :

  • 나는 객체에 내 바이트 스트림으로 변환하는 부스트 직렬화를 사용할 수 있습니까?
  • 목표는 이 아니고은 자신의 루틴을 직렬화 (유지 관리 엉망)로 돌리는 작업이 필요합니다. 내 작업을 수행하는 데 선호되는 메커니즘이 있습니다 (예 : 사용자 정의 부스트 - 순차 화 아카이브, 발견하지 못한 다른 방법).)
+0

는 "INT의 msg_num : 7"합니까하지 primitive, 내가 직렬화 문서의 깊이에 잃었어요의 필드가 7 비트 정수 의미 ? – grieve

+0

예. ": num"은 비트 필드의 길이를 나타냅니다. – jdt141

+0

이 질문은 답변이 어렵습니다. 포장 된 표현 만 표시되지만 직렬화 및 비 직렬화하려는 압축 해제 메시지 객체는 표시되지 않습니다. –

답변

1

내가보기에 사용자 지정 프로토콜과 일치하는 사용하기 쉬운 직렬기를 찾을 수 없을 것입니다. 하지만 당신은 자신의 디코더/인코더를 작성할 수있을만큼 충분히 단순한 정수 (int, bool + size)를 본다. 수신 된 메시지를 기반으로 C/C++ 코드를 생성하기 만하면됩니다. 그러한 설명을 취하는 컴파일 가능한 코드를 생성하는 것은 상당히 간단한 작업이어야합니다. 그것은 protobuf/Corba가하는 것과 비슷한 컴파일 시간에 수행되는 자동화 된 생성이어야합니다.

예 : 컨버터 (추상적 표기법 및 가정 MSB)와 유사한 몸 함수를 작성할 수

class Message{ 
    int msg_num : 7 
    int dest_addr : 4 
    bool SRR : 1 
    bool IDE : 1 
    int source_addr : 6 
    //... and so on... 
} 

: 본 명세서에서

디코더 :

m = new Message() 
{ 
    long long val = 0 
    for(int i=0; i<7; i++) { 
     val <<= 8 
     val += nextByte()  
    } 
    m.msg_num = val 
} 
{ 
    long long val = 0 
    for(int i=0; i<4; i++) { 
     val <<= 8 
     val += nextByte()  
    } 
    m.dest_addr = val 
} 
{ 
    int val = nextByte() 
    m.SRR = val 
} 
{ 
    int val = nextByte() 
    m.IDE = val 
} 
{ 
    long long val = 0 
    for(int i=0; i<6; i++) { 
     val <<= 8 
     val += nextByte()  
    } 
    m.source_addr = val 
} 
// and so on 

인코더 :

{ 
    long long val = m.msg_num 
    for(int i=0;i<7;i++) { 
     writeByte(val & 0xFF) 
     val >>= 8 
    } 
} 
{ 
    long long val = m.dest_addr 
    for(int i=0;i<4;i++) { 
     writeByte(val & 0xFF) 
     val >>= 8 
    } 
} 
.... 

생성이 쉽고 인코딩이 사용자 지정인지 확인하는 가장 간단한 방법입니다.

+0

AFAIK 표준은 구현이 비트 필드에 대해 int와 다른 유형을 사용하도록 강요하지 않습니다 (코드에 다른 유형 (예 : char 또는 bool)을 쓰는 경우에도). 그리고 표준은 비트 필드가 메모리 MSB에서 LSB 또는 그 반대의 순서로 정렬됩니다. 따라서 바이트 단위로 직렬화하는 것은 비트 필드에서 문제가 될 수 있습니다. – selalerer

+1

물론입니다. 내 대답은 솔루션보다 더 많은 예였습니다. 바이트가 와이어를 통해 정확히 전송되는 방법에 따라 정확한 구현에는 프로토콜이 반영되어야합니다. 어떻게 할 수 있었는지 아이디어를 보여주는 것이 더 많았습니다. 전환 코드를 생성하면 작업을 수행해야합니다. –

0

단일 플랫폼에만 한정되어 (즉, 단일 바이트 주문으로 제한됨) Message가 POD 유형 인 경우 메시지를 primitive으로 신고 할 수 있습니다.

적어도 boost.serialization의 경우에는 'serialization을위한 루틴'과 같은 코드를 작성해야합니다. 그것은 바이트 순서 변환, 적어도

을 지원

[편집] 잘못된, 그것은