在做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. Ubuntu14.04和Windows双系统时无法挂载磁盘解决方法

    基本状况:我电脑Ubuntu14.04 和 Windows10 双系统,一个固态磁盘,一个机械磁盘.Ubuntu14.04装固态里面了,固态里没有Windows内容. 问题:Ubuntu14.04系统 ...

  2. OpenSuSE Linux下安装Oracle10g的步骤

    OpenSuSE Linux下安装Oracle10g的步骤: --root用户 --1.vi etc/profile 添加脚本: if [ \$USER = "oracle" ]; ...

  3. Vue 波纹按钮组件

    代码链接:https://github.com/zhangKunUserGit/vue-component 效果图: 大家可以在线运行: https://zhangkunusergit.github. ...

  4. java连接sqlserver2008

    java连接sqlserver2008时应有sqljdbc4.jar驱动包.连接的示例代码如下: import java.sql.*; public class ConnectSQL { public ...

  5. PHP XML 函数

    PHP XML Parser 简介 XML 函数允许您解析 XML 文档,但无法对其进行验证. XML 是一种用于标准结构化文档交换的数据格式.您可以在我们的 XML 教程 中找到更多有关 XML 的 ...

  6. k8s Kubernetes v1.10

    #转移页面 http://www.cnblogs.com/elvi/p/8976305.html

  7. Openstack: change endpoint IP addresses after installation

    Prerequisites You have a single node DevStack installation using mysql for the database that was wor ...

  8. Antlr v4入门教程和实例

    1 重逢ANTLR 最早知道ANTLR是当年学习Apache Derby数据库源码时,在看到SQL解析那一层时,第一次看到编译原理在实际项目中的应用,惊叹之余也只能望而却步.之前也根据网上一些资料尝试 ...

  9. Leetcode解题-链表(2.2.6)RotateList

    1 题目:Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. Fo ...

  10. PLSQL程序编写杂烦数据表信息编写批量排版

    --PLSQL程序编写杂烦数据表信息编写批量排版 SELECT 'cra.' || lower(t.column_name) ||',' FROM dba_tab_columns t WHERE t. ...