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

  我负责做一款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. React.js基础知识

    一. react.js的基本使用方法 (1)快速使用,hello world <div id="app"></div> <script src=&qu ...

  2. django返回二进制图片

    @login_required def down_img(request, path): content = Storage().download(path) from django.http imp ...

  3. python3 闭包函数,装饰器

    闭包函数: 1.定义在函数内部的函数 2.包含对外部作用域而非全局作用域的引用特点: 1.自带作用域 2.延迟计算(取到内存地址,加括号执行) def 外部函数(func): def 内部函数(*ar ...

  4. Flask 基础知识一

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  5. mysql五:数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  6. H5智能表单

    表单 keygen元素的作用是提供一种验证用户的可靠方法 datalist 元素规定输入域的选项列表 output元素用于不同类型的输出,比如计算或脚本输出 智能表单 input 新增type值 em ...

  7. js加载条

    <html xmlns="http://www.w3.org/1999/xhtml"><head>    <meta http-equiv=" ...

  8. DRF的异常处理

    默认情况下,DRF框架通过内置的 exception_handler 方法,处理了如下异常: django内置异常 Http404 PermissionDenied DRF框架异常 APIExcept ...

  9. [译]Java8的函数式接口

    Java8引入了 java.util.function 包,他包含了函数式接口,具体的描述在以下api说明文档中: 函数式接口为lambda表达式和方法引用提供目标类型.每个函数式接口有一个单独的抽象 ...

  10. solr 启动过程分析

    http://www.cnblogs.com/likehua/p/4353608.html#top