标题可能说的有点混乱,再好好描述一下我遇到的问题:

  我负责做一款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接收图片的二进制流的更多相关文章

  1. 【转载】C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte

    C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte 转载:http://www.itdos.com/Mvc/20150302/0741255.htm ...

  2. php读取图片成二进制流输出

    header( "Content-type: image/jpeg");$PSize = filesize('1.jpg');$picturedata = fread(fopen( ...

  3. 【转载】C#将图片转换为二进制流调用

    在C#中可以使用MemoryStream类.BinaryFormatter类等来操作图片,将图片读取到二进制数据流中,最终转成二进制数据流进行调用,详细的实现如下方法所示. private byte[ ...

  4. 【转载】C#将图片以二进制流的方式存入数据库

    在C#开发应用程序的过程中,图片一般会存放在文件系统中,当然图片也可以二进制的方式存放到数据库中,不过一般不建议存放在数据库中,因为图片占用的空间还是挺大的,特殊情况下可以考虑将图片存在数据.此文将介 ...

  5. Unity C#图片转换二进制流、字符串互转

    图片转二进制流转换图片互转 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  6. 使用C#向Sql Sever中存取网络图片和本地图片(二进制流的形式)

    先是做普通的,存储我们本地的图片,将它转化为二进制流存储到数据库对应的表中. 代码如下: string path = "../../A.jpg"; FileStream fs = ...

  7. [转] js实现对图片的二进制流md5计算

    //计算图片md5 function img_MD5(img_path,callback) { plus.io.resolveLocalFileSystemURL(img_path, function ...

  8. C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte

    using System.IO; /// <summary> /// WebApi返回图片 /// </summary> public HttpResponseMessage  ...

  9. QTP图片验证/图片比较/二进制流对比法

    图片验证主要是文件对比,其中我们可以利用二进制的方法读取图片信息,然后进行对比,达到对比的效果,本例子利用fso对象的文件流的方法实现,代码如下: Public Function CompareFil ...

随机推荐

  1. spring 配置文件读取 mysql username报错

    在配置项目中,spring读取jdbc.properties文件连接mysql时报错:    java.sql.SQLException: Access denied for user 'Admini ...

  2. python每隔一段时间做一个事情

    #!/usr/bin/env python #coding:utf8 #Author:lsp #Date:下午2:17:54 #Version:0.1 #Function: 每隔一段时间做一个事情 f ...

  3. 【LA4670-Dominating Patterns】AC自动机

    http://acm.hust.edu.cn/vjudge/problem/19224 题意:给定n个单词,一个字符串,问哪些单词在字符串中出现的次数最多.单词aba,文本ababa,则aba出现了2 ...

  4. bzoj1015: [JSOI2008]星球大战starwar 并查集+离线处理

    题目传送门 这道题可以改为离线处理 倒着找答案 这样删点就变成加点了 有了这个思想题目就很好写了哇 23333 #include<cstdio> #include<cstring&g ...

  5. #error#错误原因:Cannot find executable for CFBundle 0x8ad60b0 (not loaded)

    #error#错误原因:Cannot find executable for CFBundle 0x8ad60b0 </Applications/Xcode.app/Contents/Devel ...

  6. 生成器版本的文件MD5校验

    生成器是一个可迭代的对象,可以对可迭代的对象进行便利,比如字符串.列表等,都是可迭代对象   def f(n): for i in range(n): yield i   特点: 1.当调用这个函数的 ...

  7. HDU1045(二分图经典建模)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. camera驱动框架分析(中)

    camera host的驱动 下面开始分析camera host吧,如果仅仅是想知道camera sensor驱动怎么写,而不想知道内部具体怎么个调用流程,怎么个架构设计,那可以跳过该部分,直接去看i ...

  9. scrapy的CrawlSpider使用

    1.创建项目 我这里的项目名称为scrapyuniversal,然后我创建在D盘根目录.创建方法如下 打开cmd,切换到d盘根目录.然后输入以下命令: scrapy startproject scra ...

  10. [ Python - 6 ] 正则表达式实现计算器功能

    要求:禁止使用eval函数.参考网上代码如下: #!_*_coding:utf-8_*_ """用户输入计算表达式,显示计算结果""" im ...