2013-10-19 45 views
0

我正在使用MessagePack開發客戶端SDK。我需要在java,ObjC和python中開發客戶端,而我的服務器是在java中。我對java和ObjC msgpack庫沒有任何問題,但在python中,當我打包字符串值超過31個字符的字典時,打包數據不會在其他語言中解壓縮。試圖在Python中解壓縮相同的工作,只要字符串長度小於32,互操作性也非常好。失敗的下面是一個Python的例子..MsgPack打包的字符串值長於32個字符python

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

此生成的二進制數據是

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

而如果我隱蔽在ObjC相同的密鑰值的字典,我得到

<81a76170 695f6b65 79da0020 61643039 37333961 63313638 66663261 31393966 62323465 62346532 34646238> 

該ObjC結果解壓縮罰款和python不會..你可以注意到從ObjC的數據額外的2個字節。

正常工作的例子如下

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

字符數= 30這裏的..和我得到以下字節在python

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

和ObjC時,得到下面的字節。

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

對不起,如果我錯過了明顯的東西..尋找任何解決方法或建議作爲我打了一天多..

在此先感謝。

+0

它應該是myPacket。抱歉! – Ravi

+0

你打開了哪個平臺? –

+0

@Tim我在ObjC中解包.. ObjC中的msgpack庫只返回一個零,不會打印任何錯誤。我也嘗試在java中解壓無效字節:-39 – Ravi

回答

2

當由十六進制字符串編碼哪些字符看,你可以看到,第一個解碼到

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

而第二個進行解碼,以

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

第三,30個字節長字符串,解碼爲

'\x81\xa7api_key\xbead09739ac168ff2a199fb24eb4e24d'  # both versions 

由此問題引起的,我搜索了MsgPac k的規格和碰到this

現在情況越來越清楚了。

  • \x81說以下是一個元素的地圖。
  • \xA7表示以下是七個字符的字符串。
  • api_key是七個字符的字符串。

到目前爲止,這麼好。現在區別開始:

  • \xd9說,一個str8字符串如下。\xd9之後的字節是\x20hex 20 == dec 32 == ASCII space)。它表示該字符串的長度(32)。這正是Python使用的原因,因爲str8可用於長度最多爲255個字符的字符串。
  • \xda說一個str16字符串如下。以下兩個字節是\x00\x20hex 0020 == dec 32,和以前一樣)。它們還表示以下字符串的長度(再次32)。這就是ObjC所做的,顯然。從規範的角度來看,這是合法的,只是有點浪費(一個浪費的字節)。
  • 對於小於32個字符的字符串,既實現使用fixstr型編碼在成爲\xbe對於30個字符的字符串(bin 10111110)位域101xxxxx的1-31個字符的長度。

如此看來,所有的序列化是正確的,但你正在使用無法處理由Python的串行使用的數據類型str8解串器。 implementation guidelines表示dut格式化更改,並非所有版本都支持str8,因此序列化程序應提供沒有它的兼容性模式。儘管如此,Python的msgpack包卻沒有。

UPDATE:就在幾個小時後bug reportmsgpack-Python開發商增加了一個兼容性開關來強制Python創建str16序列化,而不是str8。做得好!

+0

對於Python,umsgpack庫接受unicode字符,因此使用u「...」只有當字符串長度超過31時纔會發生字節差異。否則它們完全相同。 – Ravi

+0

你能提供一個可以工作的例子嗎(所以我們可以看到31到32個字符之間的確切變化)? –

+0

我編輯了一個工作示例的問題。感謝您的回覆。 – Ravi

相關問題