做Ministored的時候發現一個問題,用http傳輸二進制的數據時,需要將二進制做一下轉化,出現了以下的問題。
簡單概括如下:
1) 不知道傳輸字節的具體長度,如傳輸的int類型,將int類型之間轉爲char以後,丟失掉了長度的信息,如數字1234567,本來只有4個字節,但是轉化成文本的“1234567”是有7個字節。在int類型的時候固然好辦,但是一個數組的時候,經過轉化以後,在轉化回來就很麻煩了。
2) 對於一些數字,二進制傳輸Server是沒法處理的。如int 1,二進制數據是0x00000001,按字節傳輸的時候,client能夠正常發送,但是libevent收到以後,在拋給libevent_http層是,會把數據截斷,前兩位0x00是字符串的停止符。
所以,只能用base64來解決這個問題。base64將二進制的內容轉化成一組有意義的字符串,然後傳輸,server在decode。比較不錯的是,base64 encode以後,數據包只會增大1/3,效率還是不錯的。
下面是base64的實現,及測試代碼,聲明下base64的encode/decode不是我寫的,來自網友的實現,google/baidu下有很多的實現,我拿了一個看起來比較clean的code:)
搞定了編碼以後,明天估計網絡框架跟ministore就能聯調了,ministored有望!