標籤:
標題可能說的有點混亂,再好好描述一下我遇到的問題:
我負責做一款App的iOS版本,伺服器和Android版本都開發完了。伺服器的圖片存的不是路徑,而是在資料庫中的blob流對象,由於要求所以資料都用json傳值,圖片伺服器端的處理方式是把圖片二進位流轉化成字串。伺服器和Android都是java開發的,很方便,直接都用jackson封裝和解析就OK了,而iOS端說死也不能把這個字串解析成圖片!
不知道大家看到這能否直接發現問題出在哪裡,反正我是被這個問題折磨了將近兩天。
思路 1
起初我覺得這個問題應該不算問題,很容易搞定,就是把字串轉化成NSData對象,然後用UIImage的initWithData方法。
NSData* imgData = [imgString dataUsingEncoding:NSUTF8StringEncoding];寫完代碼,第一感覺用UTF8解析圖片流有點怪怪的,果然,圖片顯示不出來。
思路 2
既然UTF8不行,java裡預設的字元編碼不是ISO-8859-1麼,換編碼!!不好使!有病亂投醫,換成asc2編碼,還是顯示不出來圖片!
思路 3
鑽牛角尖的後果很嚴重!開始抱怨,iOS怎麼這麼坑爹啊,把字串轉成Byte數組怎麼這奇葩啊,為啥非得加上個字元編碼呢?老子自己寫個不用字元編碼的解析演算法!
於是就開始寫演算法,因為json傳過來的圖片字串是一個只有英文字母和一些普通的符號的字串,所以決定遍曆字串的每個字元,把每個字元轉換成一個8位的byte。
哈哈,自己搞除了的Byte數組應該好使吧,豈可修!!還是不好使!!!不過思路總算是正確的了。
思路 4
痛定思痛,決心好好想一想,問題到底出在什麼地方。別著急,慢慢來,相信資料到底是哪兒來的,問什麼在Android上沒問題。
我問伺服器端和Android端對接的哥們要了相關的代碼,伺服器執行完sql用ResultSet直接把blob對象轉成byte[],Bean對象"人員"類裡的頭像屬性直接就是byte[]類型的。
然後他們直接用jackson組件把Person對象轉化成json字串,加密之後直接返回給用戶端,安卓端解密後再用相同的一套組件再把json字串轉化成Person對象就搞定了!
問題是jackson底層到底是怎麼轉化的啊??
最終解決方案
由於時間問題,沒詳細研究jackson底層代碼,只好讓伺服器端改代碼了,把byte數組直接轉換成16進位字串了,雖然效率可能低點,但簡單明了。用戶端只要解析16進位字串就行了。有時間研究研究jackson的源碼,看看人家怎麼這麼轉換的。
心得
回頭看看其實問題很好解決,就是有時候太愛鑽牛角尖,好好想想問題的來龍去脈,很快就能搞定了!
iOS中用json接受圖片的二進位流