2013-10-19 1 views
0

클라이언트 SDK 개발을 위해 MessagePack을 사용하고 있습니다. 내 서버가 java에있는 동안 Java, ObjC 및 Python으로 클라이언트를 개발해야합니다. java 및 ObjC msgpack 라이브러리에는 문제가 없지만 Python에서는 31 자 이상의 문자열 값으로 사전을 압축 할 때 압축 된 데이터가 다른 언어로 압축되지 않습니다. 파이썬에서 동일하게 압축을 풀려고해도 문자열 길이가 32 미만이면 상호 운용성이 매우 좋습니다. I는 ObjC에서 동일한 키 값을 가진 사전 은밀한 경우 나MsgPack 파이썬에서 32 자보다 긴 문자열 값 패킹

<81a76170 695f6b65 79da0020 61643039 37333961 63313638 66663261 31393966 62323465 62346532 34646238> 
얻을 동안 실패 아래 하나 파이썬 예 .. 이것을 생성

myPacket = {u"api_key":u"ad09739ac168ff2a199fb24eb4e24db8"} 
msgPackedPacket = umsgpack.packb(myPacket) 

이진 데이터

<81a76170 695f6b65 79d92061 64303937 33396163 31363866 66326131 39396662 32346562 34653234 646238> 

ObjC 결과가 잘 풀리고 파이썬이 ..되지 않으며 ObjC의 데이터에서 2 바이트를 더 기록 할 수 있습니다.

제대로 작동 자 여기 = 30의

myPacket = {u"api_key":u"ad09739ac168ff2a199fb24eb4e24d"} 

수 아래의 예를 .. 내가 파이썬

<81a76170 695f6b65 79be6164 30393733 39616331 36386666 32613139 39666232 34656234 65323464> 

과 ObjC에 대해 다음 바이트를 얻을, 나는 이하의 바이트를 얻을.

<81a76170 695f6b65 79be6164 30393733 39616331 36386666 32613139 39666232 34656234 65323464> 

나는 분명히 뭔가를 놓친다면 미안해. 어떤 대안이나 제안을 찾고있어. 나는 하루 이상을 쳤다.

미리 감사드립니다.

16 진수 문자열로 인코딩 된 어떤 문자를 볼 때 두 번째는

'\x81\xa7api_key\xda\x00 ad09739ac168ff2a199fb24eb4e24db8' # ObjC's version 

세 번째, 30 바이트로 디코딩 동안

+0

myPacket으로 간주됩니다. 죄송합니다! – Ravi

+0

* 언팩하고있는 플랫폼은 무엇입니까? –

+0

@Tim ObjC에서 풀고 있습니다. ObjC의 msgpack 라이브러리는 아무 것도 반환하지 않고 오류를 출력하지 않습니다. 나는 또한 잘못된 바이트 : -03 – Ravi

답변

2

, 당신은 첫 번째가

'\x81\xa7api_key\xd9 ad09739ac168ff2a199fb24eb4e24db8' # Python's version 

에 디코딩 것을 볼 수 있습니다 긴 문자열이 문제가

'\x81\xa7api_key\xbead09739ac168ff2a199fb24eb4e24d'  # both versions 

흥미로 디코딩, 나는 MsgPac에 대한 인터넷 검색 k의 사양은 this입니다.

이제 모든 것이 명확 해집니다.

  • \x81은 다음이 하나의 요소로 구성된지도라고 말합니다.
  • \xA7은 다음이 7 자리의 문자열이라고 말합니다.
  • api_key은 7 자 문자열입니다.

지금까지는 그렇게 좋았습니다. 이제 차이점이 시작됩니다.

  • \xd9str8 문자열 다음에 오는 것으로 나타납니다.\xd9 다음의 바이트는 \x20 (hex 20 == dec 32 == ASCII space)입니다. 해당 문자열의 길이를 나타냅니다 (32). 이것이 바로 파이썬이 사용하는 것입니다. str8은 최대 255 자 길이의 문자열에 사용할 수 있기 때문입니다.
  • \xdastr16 문자열이 뒤 따른다 고 말합니다. 다음 두 바이트는 \x00\x20 (이전과 마찬가지로 hex 0020 == dec 32)입니다. 그들은 또한 다음 문자열의 길이를 나타냅니다 (32). 그것이 바로 ObjC가하는 일입니다. 이것은 스펙의 관점에서 볼 때 합법적이며 조금 낭비입니다 (1 바이트 낭비).
  • 32 문자 미만의 문자열의 경우 두 구현 모두 비트 필드 101xxxxx에서 길이가 1-31자인 코드 형식 fixstr을 사용합니다.이 형식은 30 문자 문자열 (bin 10111110)의 경우 \xbe이됩니다.

그래서 모든 직렬화가 올바르지 만 사용중인 디시리얼라이저는 파이썬 직렬 변환기에서 사용하는 str8 데이터 유형을 처리 할 수 ​​없습니다. implementation guidelines은 형식 변경을 요구하지 않으며 모든 릴리스가 str8을 지원하지 않으므로 serializer가없이 호환 모드를 제공해야합니다. Python의 msgpack 패키지는 그렇지 않습니다.

는 UPDATE : 불과 몇 시간 bug report 후, msgpack-Python의 개발자 대신 str8str16 직렬화를 만들 파이썬을 강제로 호환성 스위치를 추가했다. 잘 했어!

+0

파이썬 들어, umsgpack 라이브러리에 유니 코드 문자를 사용하므로 u ""... 바이트의 차이는 문자열 길이가 31보다 큰 경우에만 발생합니다 자바에서 압축을 풀려고했습니다. 그것들은 완전히 똑같습니다. – Ravi

+0

작동하는 예제를 제공 할 수 있습니까? (31에서 32 자 사이에 정확히 변경된 사항을 볼 수 있습니다)? –

+0

나는 예제를 가지고 질문을 편집했다. 답장을 보내 주셔서 감사합니다. – Ravi