最近写一个项目,有验证码,但是接口返回的并不是验证码图片的URL,而是返回的字节数组16进制字符串。这样就需要把16进制字符串首先字节数组,其次再把字节数组转化为NSData,最后再把NSData转化为UIImage。其中最重要的是如何把16进制的字符串转换为字节数组。首先要把字节数组和16进制关联起来。1字节(byte)就是8个位(bit)。一个位就代表一个0或1(即二进制) 。4个二进制数组成一个十六进制数。这样就把16进制的字符串和字节数组关联起来了。总结出来就是1个字节(byte) = 8位(bit) = 8位二进制数 = 2位十六进制数。由于接口是通过字节数据生成的16进制字符串所以接口返回的字符串必须是能被2整除的字符串,想清楚这些再看代码就容易的多了。

下面是核心代码:

/// 将十六进制的字符串转化为NSData
- (NSData *)transStrHexToData:(NSString *)strHex
{
/// bytes索引
NSUInteger j = ; NSInteger len = strHex.length; if (len % == ) {
/// 若不能被2整除则说明16进制的字符串不满足图片图。特此说明,假如只是单纯的把十六进制转换为NSData就把这个if干掉即可,
return nil;
} /// 动态分配内存
Byte *bytes = (Byte *)malloc((len / + ) * sizeof(Byte)); /// 初始化内存 其中memset的作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
memset(bytes, '\0', (len / + ) * sizeof(Byte)); /// for循环里面其实就是把16进制的字符串转化为字节数组的过程
for (NSUInteger i = ; i < strHex.length; i += ) { /// 一字节byte是8位(比特)bit 一位就代表一个0或者1(即二进制) 每8位(bit)组成一个字节(Byte) 所以每一次取2为字符组合成一个字节 其实就是2个16进制的字符其实就是8位(bit)即一个字节byte
NSString *str = [strHex substringWithRange:NSMakeRange(i, )]; /// 将16进制字符串转化为十进制
unsigned long uint_ch = strtoul([str UTF8String], , ); bytes[j] = uint_ch; /// 自增
j ++;
} /// 将字节数组转化为NSData
NSData *data = [[NSData alloc] initWithBytes:bytes length:len / ]; /// 释放内存
free(bytes); return data;
}

都把16进制的字符串转换成NSData了。在转换为UIImage想必都知道啦。。。

下面是验证码的16进制字符串,可以用下面的数据测试

89504E470D0A1A0A0000000D494844520000005A000000320806000000DC0FCC3500000A754944415478DAED998957145716C6F307CC9C93334B124F26C6498C4B0C51A332C6054570478D5BDC22D2B2854541E20682BB44148C10346A44625C70898A062411017103456491455110B0D99A86EA7DA9EAEE6FDE7B0E9E710459CA8C33A6EE39757AA9EAAAAEDFBBEFBBDF7DF51AA4F8AFC46B120209B4045A0A09B4045A022D85045A022DC5EF13B4AA59833AB9020DB54A988C66F0BC403E37A2B2BC0675350AF29D891D6736F1D0EB0C10C87E097407C266B3A1EE910287F79CC39E8863880D3F82C8D038ACF1DD09BF399BE03F6723427C76627D402CC2FC63104ABE0F5FB1077BB71FC3F1B8F3484BCA424D55BD04BABDB05A6DA87DD480E9C39660EC478B31618027260EF08263EF4518DD8B6EAEECFDB88F3DD8AB535F37729C3BC6F65B0CE70F6598D0DF03319B0EFDBE41D36CB55AADED1E575D518B8890FDF84A1681D59E51D810B80B5FAFDC8750BF684CB5F78543CF85709DB00AABBCA2584607B945C07D5A28E6392DC77CE7E558B6682B4A0A1EC062B1FC7E4053B845770B117B301A172EA7C064367648978BF2CA5090731725F9E5B857F410F78A1FE26AEA2DACF28862A003166CC1CF273270E3722172AEDD21AF05484BCEC6992317716CFF79E45E2F86416F7A354153A874FBF730994D389D72122E6E4EE4F54487CE63112CACF0592D56763E9A9966338F86BA26C47DF3131C3E5808994B08327FBD8966A58A15489EEC57715A34D637A3BE4609A58283D1F08A825656D7931B363F055EA3D320F6876F30C4E52396D162C2A033E25C423AD3E269FFF043D2F10C7004F47F0E6ECBB52D16EBAB039A6A6E6D5915D68F74C78F81DB61369A9EBA599D5E07BF500FF41DF32EAEE75E11752D81647AE62F39983CC89B1441197E883DC31C8AD859683693CD642333C3C68A716B03D772EC4B014D2F6CD0E810E71B8E2FDF7286F2517D2B3761C6A7D3FA63E4CC21287D502CFA7A3957EF60F6C840A6D3516BE3515126177DCEE6260BF26FF1C8CDE651562210D9B13CA798DBC8805BA1D7934D47DFDBC4816ED146AEB6119A46EE19B740F70B8280EC9F52E1D36D2C320E24B67A0EA3D1881EC3DE805BD03C343689CFBEBCEC12C8268730D0D485941494BF808CB6206AA31EB39CD598335E83DD910634355ADBB49F4A8580EB9966A49C3593222D741D34BDB85AD18CBCF357707CCDB7C83E91FAD4B461234BF4AFAAB00C9B1C3DB16D6A40ABB68D7E77BFE21E7A3ABC8D88EF36B539F53A1A74E06F679560C9BCCD1845FCF4D2059B917FA394154371A0AD387AC088A90E2AD875E31020D3E2CE6DA14DD065A5021B98E98E1A6C58A1EB3A6893DE88BCE42BD83AC10F7E6F8FC35EF7F568782887CD6A7B02B049DE801F96462078E05C54E6DF6BF506B43A2DF61CDE854F26F5C5B9D433A2A58A3A919CAB4558E9BE1D8E7D16C18378E7EBE979D010B721268C461B2EFD6AC6DC096A0CEEC1C1F3730DD27F31B77A2C4FF4BCB88047B0BF0E1FFE9583D71C4DD741537B252F29C7C1C06DF07D7B3CC95A2FDC3A77890C8081EDD736AB911C7508A143BE40465C223BBE35D0F7CA4BE11A38072E3267DC2ECA110D5AA73520EB523E82BD76B08C96B9ACC185C46B50367022678A0D85B93C7C176831EA23155CA76A907CDAD4C6603F3E76C5975AF47B83C3575E3A711AADE33448DB770AA1F65F600DD92EEE3D091D014C176D2E1D3C87D0A1AE38B3793F83DE961B49387B08F653ED10B26D39E4F58F4483D6A874B89E9687E58BB7B156DC6BC65AFC7C2C83796731B2447F9B9FC363B9B70EA3ECD424B3354822A08DC667E5D0682005398B2799AC455F92D1D15F1BC48116781E85A9D9F89AC847C0FB53703C6C17945575B89598CEE4E2C7659168AE51B47983544FE72F998911330621E96222F406FD0B014D33DA6FCE468C215EDAEBB3B5483E718981160471ED7601711D419E5A221D2ACC9DA8466AB289CCA0D6405B7139CD8C4943D5E8FD270E69E7CDE25D47F59DFBD8316339DCFE300C7B64EB5070210BFEDD2722724A20CBF8E7FDB6C56D78AF76438352FC6A1AB392A476DCC82C84F78C75CC75CC750CC2AF895709E826D1E72E2FE3219BA181DD5B1C164DD3E25A06DFEA712693152989267CF03AC740538B270AB4D54275BA8215BC80F75C881E2F40C8A0F9D8397B25EA1F543FF7B75AD20DEE3E180D87594370ECEC61E20A78F1A04921E69AD448397D05FE733731E9904D09C1D98434B65E2D463AA893A03EDA6396866974A0BB0E39D75B075D27B760DB3A3D03ED43349D6AB6E8864551558B78FFAD5842B2D8EB2F8ED8B5301435A515CFBD29BAEF6ACE658C5F380ACB36F8A1F2D1C317D620D5CB1B9178240DAE13831968DFCF3722F9642614754DCCD38BC9685AFCE64F52C369A09A58363D2ACB5B2FF0B410CE72D6A0CF9F39249D328B6F585A2CDC019F702CFEE3706C76F26619DE1E649ACD2BC303F1E1981E484E3BFBC22053CD97573730D0B34606B0B5696AEFD293B2454B07B57747E38C7019A682FD7B1CD605E9406FF3F1F6B81BD4EBACE0380B297E8FB3D9B1BF8AC9C60B69C1CB738A11F55910C2862E424E62060433DFEEE09C4C4EC0A7D30762499817CAABEEB79B491D0DFAA8AAF27E0DE2634E63BEF30A8CE9EB8665AE5B9FD83B31D2515F6BC1A1EF0D98324285017FE3B054A64106F1D577F204DC220E232DC584E8703D269381E8F726874FBA73D8FB8D81796AD1A0A9374E894E80C7EB0E488949004F9A85F66E866AF1E8D9F6E83FBE17D2AEA5C2CC9B9F6C2D4BA806A3812D3459AC964EC1A12B7165C595F86E6B02C6D9B9B362B8CA3312D99905501337D291070A6D05CDD6ACCB3C9C07710CE4F03E2A2C98AC81DB740D663AA931CE5E85B18354F024CD092D805346AA588BDEF2FFBB0C9A3799703BE932D60D77C38EE94190973EECD0D48E3FF13DFA39BF87155B029057940B79DD233CAC2E4705D9CA482B7EF77E09F24B6E13DDAEE83418AD5A8FBCEC526C0F8D83CB601F4C1AE88DB5FE310C342D92620AA1C05B515723E0D84103962CD2B2A2E83D4FCB7CF5E6603D4E1E36A1E40E8F8BC4CA9D3A622499CEB32647F4EA9DA2B206E1CE3EF0796B2CF3D2ED49065B2B3618603FC50E23660EC6966FD723FEF83E1C3CB91F7B0E7D8B6DDF6DC6A6E83084C7AE47E4DE70D4D4C93B0D9A7AE8DCAC62F640D6A99F8C48870C9161F128B879974C61A1CBD2D1A2C3141CD764C1BD120105A4E0DD2D16D0A8B03E05F4F1AC7D7629B54BA0D58DCD38B5712F96BE3B0927427741ABE4DAD5594EC511805BD17BF43B184E1A94B1F347B285FE3E8EDD31745A7F067FB04B3FF41AF50E568707A159D5D4C942480A7323C79E70AFF088C4E44FBE642B78713B7FC283D22AE6AF5FD4D3218B607B06EE6FB2F05F947E933525BB89955356D7B59B79F4CFA5133D1E38B137930DBB713DF1F7E16FB266A517016F3FF56306F9FD11DDF0F1B80F70ABE02678A1F3BE9A3E9AA2CF01A337FE8888E0FD3875E8026A880B1193CD2FE5090BFDB35585F711332F181B1C1633E01DF94D4DBD9C69337519CB36F8222C7215228854441F882292B185BD8F89DF817D4777E3E2D50B50A93BBF0044F55FAF3332F9F85F8C4E81D6ABB4381E1A8BD5FD3F47EEB94C56103B025AD9A460454FB008FFFADCC83E3771CA274E84B6E08DCD0ABCAAD161D0B4DDD6ABB55011E36FD4E8BB64955EF6F4FDBFC9682924D012682924D0126809B414126809B414126809B4045A0A09B4045A0A1AFF049DE45661B57926D90000000049454E44AE426082

最后附上生成的验证码图片

若有疑问请加我的QQ:610774281。一起探讨一起进步。。。。

将十六进制的字符串转化为UIImage的更多相关文章

  1. Python十六进制与字符串的转换

    电脑上装了Python2.7和3.3两个版本,平时运行程序包括在Eclipse里面调试都会使用2.7,但是由于某些原因在cmd命令行中输入python得到的解释器则是3.3, 一直没对此做处理,因为这 ...

  2. SQL Server中字符串转化为GUID的标量函数实现

        还是工作中遇到的需求,有时候和外部的系统对接,进行数据的核对功能,外部的系统有时候主键字段列数据类是UNIQUEIDENTIFER(GUID)类型的字符串格式,去除了GUID格式中的分隔符“- ...

  3. iOS十六进制和字符串的相互转换

    转换代码,崩溃日志有些是十六进制 NSString *dictString = [dict JSONFragment];//组合成的 dictString==={"content" ...

  4. nodejs将JSON字符串转化为JSON对象

    如何将JSON字符串转化为JSON对象? JSON.parse(str)       JSON是javascript的一个内置对象,提供了转换JSON对象与字符串互相转换的方法: 问题来了,道理我都懂 ...

  5. python 字符串转化为json、post请求

    在json模块有2个方法, loads():将json数据转化成dict数据 dumps():将dict数据转化成json数据 load():读取json文件数据,转成dict数据 dump():将d ...

  6. [Windows] [VS] [C] [取得指针所指内存的十六进制形式字符串]

    接口定义如下: #include <Windows.h> // 取得指针所指内存的十六进制形式字符串,size指定字节长度 #define Mem_toString(address, si ...

  7. 一个将lambda字符串转化为lambda表达式的公共类

    一个将lambda字符串转化为lambda表达式的公共类.StringToLambda 使用方式如下: var module = new Module(); url = url.ToLower();/ ...

  8. 一组十六进制的字符串每两个转成对应值的byte

    /// <summary> /// 一组十六进制的字符串每两个转成对应值的byte,比如4142 会成 AB对应的byte列表 /// </summary> /// <p ...

  9. Java序列化对象为字符串并将字符串反序列化为对象

    对象的序列化与反序列化其实就是将对象的状态保存下来,一般是保存到文件中,但是其实更常用的是将对象序列化为字符串保存到数据库中,然后在需要读取对象的情况下将字符串反序列化为对象.   可以序列化的类必须 ...

随机推荐

  1. git使用和理解之一(不含分支)

    0.前言 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 工作区和暂存区: 我们写代码的地方就是工作区,代码写完后, ...

  2. 滑动式折叠菜单 - Slashdot's Menu

    折叠菜单让你在尽可能小的地方放置尽可能多的内容,同时加大了操作的简便性,因此,深受前台设计师的喜爱.随着大家对动画效果的钟爱,折叠菜单也开始“动”起来了,本文介绍的就是 DimX 制作的滑动式折叠菜单 ...

  3. HttpHandler

    HttpHandler初探 一.HttpHandler简介 HttpHandler是asp.net真正处理Http请求的地方.在这个HttpHandler容器中,ASP.NET Framework才真 ...

  4. (转)Spring中@Async用法总结

     原文:http://blog.csdn.net/blueheart20/article/details/44648667 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的: ...

  5. ASP.NET MVC 4 (三) 过滤器

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

  6. Eclipse 常用快捷键

    Ctrl + Shift + L  : 可以查看快捷键方式 Ctrl + 1 : 快速修复 Ctrl + / : 注释当前行 Ctrl + D : 删除当前行 Shift + Enter : 可以在当 ...

  7. 【mysql】关于循环插入数据 存储设计

    要求插入的数据有一定的规律 新建实例列表 CREATE TABLE users ( userId ) NOT NULL, userName ) NOT NULL, Serves ) NOT NULL, ...

  8. Spring(1)

    一.Spring是什么? .Spring是一个开源的框架 .是一个IOC(DI)和AOP容器的框架 .这个框架是为了简化企业级应用开发而生的,使用Spring可以使简单的JavaBean实现以前只有E ...

  9. Also unsere eigene Christian Louboutin Webshop bietet die überragende Christian Louboutin Schuhe uk schiebt zusammen mit kostengünstigen Wert

    www.heelschuhe.de, Es ist wirklich eine der Frauen erfordern immer interessant und auch Louboutin Pu ...

  10. flex中image控件source属性改变的例子

    Download: main.mxml <?xml version="1.0" encoding="utf-8"?> <mx:Applicat ...