NSData 与 struct 以及XML的转换

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

1、struct转换为NSData

例如如下的struct:

struct tagPackageHead		
{
	tagPackageHead()
	{
		memset(this,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。

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念