在做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...