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 ...
随机推荐
- Ecplise下设置jQuery和ExtJs自动提示
Spket 1.6.23下载: http://yunpan.cn/cjJYmEcMFIuuN 访问密码 5642 ext jsb下载:http://yunpan.cn/cjJYR7ZTzibQn ...
- Qt 设置应用程序图标(windows)
Step 1: 创建 xxx.rc 文件. 将ico图标文件复制到项目根目录下.然后在该目录中新建xxx.rc文件,并输入一行代码: IDI_ICON1 ICON DISCARDABLE " ...
- 最短路径算法 SP
dijkstra求最短路径长度 dijkstra求最短路并记录路径 #include<stdio.h> #include<string.h> #include<stack ...
- golang的各种打印
golang的打印方法太特么多了,下面就来区分一下之间的差异 package main import ( "fmt" "os" ) func main() { ...
- P1709 [USACO5.5]隐藏口令Hidden Password
P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<= ...
- 【python】抄写大神的糗事百科代码
照着静觅大神的博客学习,原文在这:http://cuiqingcai.com/990.html 划重点: 1. str.strip() strip函数会把字符串的前后多余的空白字符去掉 2. resp ...
- docker从零开始网络(七) 配置daemon和容器
启用IPv6支持 在Docker容器或swarm服务中使用IPv6之前,需要在Docker守护程序中启用IPv6支持.之后,您可以选择将IPv4或IPv6(或两者)与任何容器,服务或网络一起使用. 注 ...
- Deep Learning关于Vision的Reading List
最近开始学习深度学习了,加油! 下文转载自:http://blog.sina.com.cn/s/blog_bda0d2f10101fpp4.html 主要是顺着Bengio的PAMI review的文 ...
- hdu 5194(DFS)
DZY Loves Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- AC日记——T-Shirt Hunt codeforces 807b
T-Shirt Hunt 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> ...