在做OC与C++ 混编的时候,我们可能会用到struct 与NSData的相互转换。在这里做一个记录

1、struct转换为NSData

例如如下的struct:

struct tagPackageHead
{
tagPackageHead()
{
memset(this,0,sizeof(*this));
bStartcode = 0xFE;
}
Byte bStartcode;
uint iCmd;
uint iXMLLen;
uint iSeqNumber;
Byte bExpand[10];
};
struct tagPackageHead tagPack;
tagPack.bStartcode = 0xFE;
tagPack.iCmd = CMD_CLIENT_LOGIN;
tagPack.iXMLLen = data.length;
tagPack.iSeqNumber = 1;

以上是在OC中定义一个结构体,然后需要转换为NSData。转换的过程如下:

NSData *headerData = [NSDatadataWithBytes:&tagPacklength:sizeof(tagPack)];

2、NSData转换为struct

struct tagPackageHead tagPack;
[data getBytes:&tagPack length:sizeof(tagPack)];
NSLog(@"tagPack.iXMLLen:%d",tagPack.iXMLLen);
NSLog(@"tagPack.iCmd:%d",tagPack.iCmd);
NSLog(@"tagPack.iSeqNumber:%d",tagPack.iSeqNumber);

3、创建XML文件,本来打算用kissXML的,结果找不到如何讲kissXML转换为NSData,而且文件又多,就换成了GDataXMLNode了。直接上代码:

//创建XML
GDataXMLElement *rootElement = [GDataXMLNode elementWithName:@"SignInReq"];
GDataXMLElement *element = [GDataXMLNode elementWithName:@"ClientType" stringValue:@"PC"];
[rootElement addChild:element];
element = [GDataXMLNode elementWithName:@"UserName" stringValue:@"abcdef"];
[rootElement addChild:element];
element = [GDataXMLNode elementWithName:@"Password" stringValue:@"123456"];
[rootElement addChild:element];
element = [GDataXMLNode elementWithName:@"UserAgent" stringValue:@"1.01"];
[rootElement addChild:element];
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithRootElement:rootElement];
NSData *data = [document XMLData];

4、解析XML文件

因为服务器返回的数据中有包头和XML文件两部分,所以要先获取包头,然后再获取XML文件

struct tagPackageHead tagPack;
[data getBytes:&tagPack length:sizeof(tagPack)]; NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *string = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(sizeof(tagPack), tagPack.iXMLLen)] encoding:enc];
NSData *data2 = [string dataUsingEncoding:NSUTF8StringEncoding]; NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path=[paths objectAtIndex:0];
NSString *areaDevice_path=[path stringByAppendingPathComponent:@"areaDevice.xml"];
//==写入文件
[data2 writeToFile:areaDevice_path atomically:YES];
//开始解析
NSDictionary *dict = [NSDictionary dictionaryWithXMLData:data2];

这里第二行的data,就是从服务器返回的NSData类型的data,先获取包头,因为服务器返回的格式是GBK格式,所以转码一次,然后保存到本地后,解析转换为字典,解析用的第三方是XMLDictionary。

NSData 与 struct 以及XML的转换。的更多相关文章

  1. 利用JAXB实现java实体类和xml互相转换

    1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...

  2. 将Xml字符串转换成(DataTable || DataSet || XML)对象

    今天用到一个功能:就是把从数据库读出来的内容转换成XML字符串流格式,并输出给一个功能函数.在写的过程,为方便以后的使用,我对这一功能进行分装.该类的具体格式如下:XmlConvert类命名空间:Ni ...

  3. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

  4. json串转化成xml文件、xml文件转换成json串

    1.json串转化成xml文件 p=[{"name":"tom","age":30,"sex":"男" ...

  5. SpringMVC源码阅读:Json,Xml自动转换

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  6. JAXB实现java对象与xml之间转换

    JAXB简介: 1.JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标 ...

  7. c#开发微信公众号——关于c#对象与xml的转换

    在成为微信公众号开发者以后,整个交互流程:用户->微信服务器->自己的服务器->返回微信服务器->用户: 举个例子:用户在微信公众号里面发了个“您好!”,微信服务器会以特定的x ...

  8. C# 实现DataTable、DataSet与XML互相转换

    /**//// <summary> /// 把DataSet.DataTable.DataView格式转换成XML字符串.XML文件 /// </summary> public ...

  9. Sql 把Xml字符串转换成一张表

    分享一个Sql技巧,把xml字符串转换成一个表格 DECLARE @IdHandel INT EXEC sp_xml_preparedocument @IdHandel OUTPUT, @Bar_Ip ...

随机推荐

  1. PHP 5 String 函数

    PHP 5 String 函数 PHP String 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. 函数 描述 addcslashes() 返回在指定的字符前添加反斜杠的字符串. add ...

  2. Docker 镜像

    Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. D ...

  3. RunLoop总结:RunLoop的应用场景(五)

    今天要介绍的RunLoop应用场景感觉很酷炫,我们可能不常用到,但是对于做Crash 收集的 SDK可能会用得比较频繁吧.相比关于RunLoop 可以让应用起死回生,大家都听说过,可是怎么实现呢?今天 ...

  4. Bootstrap3 排版-列表

    无序列表 排列顺序无关紧要的一列元素. <ul> <li>...</li> </ul> 有序列表 顺序至关重要的一组元素. <ol> < ...

  5. Dynamics CRM 部署NLB后使用群集名称访问弹验证框验证不过的解决方法

    自上次部署NLB到现在已有段时间了,今天部署完后遇到了个问题,上次也遇到过但忘记了,本篇作为对该问题的一个记录,部署文档:https://blogs.msdn.microsoft.com/niran_ ...

  6. Win7下安装linux虚拟机

    关于如何在Win7下搭建linux学习环境,特在此分享下. 一.工具 1.VMware-workstation-full-9.0.0-812388.exe       下载地址:http://pan. ...

  7. EBS技术开发之VPD策略

    VPD (虚拟专用数据库的简称),主要作用是根据运行环境的上下文,隐式的添加条 件. 好处是在数据库层解决细粒度的角色权限访问,避免在中间层写大量代码:坏处 是数据屏蔽的逻辑太隐蔽了,对于分析查找问题 ...

  8. [error]error while loading shared libraries: libpcre.so.1 解决

    nginx 安装好之后,启动的时候报错 [root@localhost nginx-1.6.2]# /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin ...

  9. FFmpeg源代码简单分析:av_write_frame()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  10. Activity和Window的View的移动的一些思考与体会,腾讯悬浮小火箭的实现策略

    Activity和Window的View的移动的一些思考与体会,腾讯悬浮小火箭的实现策略 事实上写这个也是因为自己实际在项目中用到了才会去研究已经写文章,对于View的移动,其实说实话,已经有很多文章 ...