NSData 與 struct 以及XML的轉換。

2021-06-22 14:56:27 字數 2703 閱讀 5945

在做oc與c++ 混編的時候,我們可能會用到struct 與nsdata的相互轉換。在這裡做乙個記錄

1、struct轉換為nsdata

例如如下的struct:

struct tagpackagehead		

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 = [nsdata

datawithbytes:&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];

//==寫入檔案

[data2 writetofile:areadevice_path atomically:yes];

//開始解析

nsdictionary *dict = [nsdictionary dictionarywithxmldata:data2];

這裡第二行的data,就是從伺服器返回的nsdata型別的data,先獲取包頭,因為伺服器返回的格式是gbk格式,所以轉碼一次,然後儲存到本地後,解析轉換為字典,解析用的第三方是xmldictionary。

UIImage與NSData間的轉換

這樣子?uiimage imagecopy image copy 但你會發現image被編輯之後,通過imagecopy 獲取到的也是編輯過的 淺拷貝 你是不是想說那我mutablecopy,呃?想法不錯,但是uiimage沒有實現這個協議啊!那怎麼辦,自己實現nsmutablecopying 協議...

C 中struct與class的區別以及聯絡

上一周因為參加乙個比賽,整個都投入進去了,也就荒廢了看書以及部落格,不過不代表沒有遇到新的問題。在比賽中,我用到了結構體struct,在我過去的印象裡,struct代表結構體,主要存放一些資料變數,打包起來,成為乙個整體,不過前段時間在c primer書上類那一章看到,struct與class似乎是...

typedef struct與struct的區別

1.基本解釋 typedef為c語言的關鍵字,作用是為一種資料型別定義乙個新名字。這裡的資料型別包括內部資料型別 int,char等 和自定義的資料型別 struct等 在程式設計中使用typedef目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比較複雜的型別宣告。至於ty...