2012-09-14 3 views
1

, 종류에 따라 적절하게 직렬화하는 기능 (팩) 데이터가 있습니다 데이터의 압축을 풀기 위해 API에서 동등한 호출이되어야합니다. msgpack_unpack_nextmsgpack_object을 반환합니다. 이러한 객체는 포함 된 열거 형을 기반으로 유형의 거친 입상 성 (유형 중 가장 큰 유형 : int64, double, ...) 만 있습니다.MessagePack C의 API

여기에 뭔가가 있습니까? 거친 물건을 사용하고 나서 던지기를 기대합니까?

어떻게 포장을 풀어야합니까?

더 좋은 문서 또는 사용 예가 있습니까? 웹 사이트에있는 것들은 사소한 것입니다.

+0

어디 MessagePack의 C API를이다 ? – sivann

+0

@sivann https://github.com/msgpack/msgpack-c 또는 http://msgpack.org – CNK

+0

감사합니다. 나는 더 많은 분석적 문서가 있기를 희망했다. – sivann

답변

8

언팩시 정수 값은 항상 고정 너비 64 비트 정수 (int64_t 음수 인 경우, uint64_t이 아닌 경우)로 msgpack_object 내에 저장됩니다. , msgpack 가장 최적의 방법을 동적으로 선택

static inline int template_callback_int8(unpack_user* u, 
             int8_t d, 
             msgpack_object* o) { 
    if(d >= 0) { 
     o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; 
     return 0; 
    } 
    else { 
     o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d; 
     return 0; 
    } 
} 

이 팩시 때문이다.

는 msgpack는 풀고 로직, 예를 처리하는 방법을 볼 수 msgpack_object 등, 그리고 cpp/src/msgpack/unpack.c에 대한 자세한 내용은 cpp/src/msgpack/object.h를 참조하십시오 값에 따라 정수를 부호화한다. 값이 [128 인 경우 값이 [0, 127]에있는 경우

  • 가 1 바이트에 저장됩니다,
  • 2 bytes0xcc와 함께 첫 번째 바이트로 : 당신은 다음 정수 팩을 msgpack_pack_uint16를 사용하는 경우 , 255],
  • 3 bytes0xcd을 그렇지 않으면 첫 번째 바이트로 사용합니다.

자세한 내용은 cpp/src/msgpack/pack_template.h에서 msgpack_pack_real_uint16을 참조하십시오. 임의의 정수 값을 보유 (obj.typeMSGPACK_OBJECT_POSITIVE_INTEGER 또는 MSGPACK_OBJECT_NEGATIVE_INTEGER 경우 시험)을 풀고시 말하면


는 msgpack는 충분히 큰 양 또는 음을 이용한다. 당신은 항상 값이 캐스트 유형을 오버플로하지 않을 것이라고 가정 할 수있는 경우 값이 수신기에 대한 충분하지 않은 경우 또는, (마스크 포함) 동적으로 확인

  • 캐스트
  • : 그래서 그것은 당신에게 최대의
  • 또는 항상 int64_t 또는 uint64_t을 사용하십시오.

마침내 C 테스트 스위트 (msgpack/cpp/test/msgpackc_test.cpp)가 코드 샘플을 탐색하는 데 도움이 될 수 있습니다.당신은 쉽게 C 인터페이스 이진 직렬화가 필요한 경우

+0

고마워요! 나는 같은 결론에 도달했다. msgpack은 유선상에서 효율적이며 적절한 변환을위한 프로토콜을 아는 것은 사용자의 몫입니다. 그 효율성의 비용은 포장을 풀 때 자동으로 원래 유형을 추론 할 수 없다는 것입니다. – CNK