標題可能說的有點混亂,再好好描述一下我遇到的問題:
我負責做一款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的源碼,看看人家怎么這么轉換的。
心得
回頭看看其實問題很好解決,就是有時候太愛鑽牛角尖,好好想想問題的來龍去脈,很快就能搞定了!
