iOS中用json接收图片的二进制流
标题可能说的有点混乱,再好好描述一下我遇到的问题:
我负责做一款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接收图片的二进制流的更多相关文章
- 【转载】C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte
C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte 转载:http://www.itdos.com/Mvc/20150302/0741255.htm ...
- php读取图片成二进制流输出
header( "Content-type: image/jpeg");$PSize = filesize('1.jpg');$picturedata = fread(fopen( ...
- 【转载】C#将图片转换为二进制流调用
在C#中可以使用MemoryStream类.BinaryFormatter类等来操作图片,将图片读取到二进制数据流中,最终转成二进制数据流进行调用,详细的实现如下方法所示. private byte[ ...
- 【转载】C#将图片以二进制流的方式存入数据库
在C#开发应用程序的过程中,图片一般会存放在文件系统中,当然图片也可以二进制的方式存放到数据库中,不过一般不建议存放在数据库中,因为图片占用的空间还是挺大的,特殊情况下可以考虑将图片存在数据.此文将介 ...
- Unity C#图片转换二进制流、字符串互转
图片转二进制流转换图片互转 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- 使用C#向Sql Sever中存取网络图片和本地图片(二进制流的形式)
先是做普通的,存储我们本地的图片,将它转化为二进制流存储到数据库对应的表中. 代码如下: string path = "../../A.jpg"; FileStream fs = ...
- [转] js实现对图片的二进制流md5计算
//计算图片md5 function img_MD5(img_path,callback) { plus.io.resolveLocalFileSystemURL(img_path, function ...
- C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte
using System.IO; /// <summary> /// WebApi返回图片 /// </summary> public HttpResponseMessage ...
- QTP图片验证/图片比较/二进制流对比法
图片验证主要是文件对比,其中我们可以利用二进制的方法读取图片信息,然后进行对比,达到对比的效果,本例子利用fso对象的文件流的方法实现,代码如下: Public Function CompareFil ...
随机推荐
- php设定错误和异常处理可使用的函数
1.register_shutdown_function 使用场景:当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,这个函数会被调用. 函数介绍: void register_shutdown ...
- 图论:Dinic算法
解决最大流问题我搜到了一堆的算法:EK算法.FF算法.Dinic算法.SAP算法.ISAP算法 然而并没有什么鸟用 掌握最常见的Dinic就够了,据说极限优化的ISAP比Dinic更快一些..我当不知 ...
- poj3580 序列之王 fhqtreap
fhqtreap的写法 操作其实都差不多哇 #include<cstdio> #include<cstring> #include<algorithm> using ...
- 【BZOJ】[SDOI2009]HH的项链
[算法]主席树||离线+树状数组 [题解] 主席树经典应用:找区间不同的数字个数. 做法:记录每个数上一次出现的位置last[i],对last建权值线段树,对于区间询问last[i]<L的数字个 ...
- JHDU 2601 An easy problem (数学 )
title: An easy problem 数学 杭电2601 tags: [数学] 题目链接 Problem Description When Teddy was a child , he was ...
- 使用pandas进行数据清洗
本文转载自:蓝鲸的网站分析笔记 原文链接:使用python进行数据清洗 目录: 数据表中的重复值 duplicated() drop_duplicated() 数据表中的空值/缺失值 isnull() ...
- PHPExcel 长数字串显示为科学计数 与 其他错误
一.解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号 ...
- BZOJ 3098
: Hash Killer II 时间限制: Sec 内存限制: MBSec Special Judge 提交: 解决: [提交][][] 题目描述 这天天气不错,hzhwcmhf神犇给VFleaKi ...
- docker从零开始 存储(四)tmpfs挂载
使用tmpfs挂载 volume和bind mounts允许您在主机和容器之间共享文件,以便即使在容器停止后也可以保留数据. 如果你在Linux上运行Docker,你有第三个选择:tmpfs moun ...
- c语言中Triplet是什么意思?
此词条多出现于三元组抽象数据类型的定义. 例如: 数据结构编程试验中,构造三元组类型. 1.三元组抽象数据类型的定义 ADT Triplet { 数据对象:D={e1, e2, e3| e1, e2, ...