一蠢沿、起因
在使用Socket編程發(fā)送包頭給服務(wù)器時(shí)苛吱,需要把int類型數(shù)據(jù)包裝成NSData類型屹电。
二盟庞、方案
- 方案1(調(diào)用系統(tǒng)API-推薦)
// OC版
// int轉(zhuǎn)NSData
int a = 123;
NSData *data = [NSData dataWithBytes:&a length:sizeof(a)];
// NSData轉(zhuǎn)int
int b = 0;
[data getBytes:&b length:sizeof(a)];
// Swift版
var a : Int = 123
let data = NSData(bytes: &a, length: 4)
var b : Int = 0
data.getBytes(&b, length: 4)
- 方案2(字符串中轉(zhuǎn)-效率差)
int num1 = 123;
NSString *str1 = [NSString stringWithFormat:@"%d", num1];
NSData *data = [str1 dataUsingEncoding:NSUTF8StringEncoding];
NSString *str2 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
int num2 = (int)[str2 integerValue];
- 方案3(自定義方法-有問(wèn)題)
// NSData轉(zhuǎn)int
- (int)data2Int:(NSData *)data{
Byte *byte = (Byte *)[data bytes];
// 有大小端模式問(wèn)題吃沪?
return (byte[0] << 24) + (byte[1] << 16) + (byte[2] << 8) + (byte[3]);
}
// int轉(zhuǎn)NSData
- (NSData *)int2Data:(int)i{
Byte b0 = i & 0xff;
Byte b1 = i >> 8 & 0xff;
Byte b2 = i >> 16 & 0xff;
Byte b3 = i >> 24 & 0xff;
// 有大小端模式問(wèn)題?
Byte result[] = {b0, b1, b2, b3};
return [NSData dataWithBytes:result length:sizeof(result)];
}
三什猖、附:大小端模式
- 名詞解釋
大端模式:是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中票彪,而低子節(jié)數(shù)據(jù)保存在內(nèi)存的高地址中。
小端模式:是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中不狮,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中降铸。
- 為什么會(huì)有大小端模式?
處理器(例如32位或者64位的cpu)的發(fā)展摇零。
ARM芯片(iPhone)默認(rèn)采用小端推掸。
- 驗(yàn)證代碼
驗(yàn)證方式1:(強(qiáng)轉(zhuǎn))
short int a = 0x1122; // 十進(jìn)制為4386,其中11稱為高子節(jié)(即15~8位)驻仅。
char b = ((char *)&a)[0]; // 取變量a的低子節(jié)(即7~0位)
printf("%x", b); // 輸出22代表編譯器為小端模式
驗(yàn)證方式2:(便于理解)
int num = 0x12123678; // 十進(jìn)制為305419896
char a = num & 0xff; // 取(0 ~ 7位)一個(gè)子節(jié)
char b = num >> 8 & 0xff; // 取(8 ~15位)一個(gè)子節(jié)
char c = num >> 16 & 0xff; // 取(16~23位)一個(gè)子節(jié)
char d = num >> 24 & 0xff; // 取(24~31位)一個(gè)子節(jié)
printf("%x, %x, %x, %x", a, b, c, d); // 小端模式將輸出78,56,34,12
驗(yàn)證方式3:(利用共同體特性)
代碼參考下面推薦的文章(嵌入式)
- 文章推薦
《詳解大端模式和小端模式》
http://blog.csdn.net/ce123_zhouwei/article/details/6971544