iOS中int與NSData互轉以及大小端模式

一、起因

在使用Socket編程發送包頭給服務器時,需要把int類型數據包裝成NSData類型。

二、方案

  • 方案1(調用系統API-推薦)
// OC版
// int轉NSData
int a = 123;
NSData *data = [NSData dataWithBytes:&a length:sizeof(a)];
// NSData轉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(字符串中轉-效率差)
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(自定義方法-有問題)
// NSData轉int
- (int)data2Int:(NSData *)data{
    Byte *byte = (Byte *)[data bytes];
    // 有大小端模式問題?
     return (byte[0] << 24) + (byte[1] << 16) + (byte[2] << 8) + (byte[3]); 
}

// int轉NSData
- (NSData *)int2Data:(int)i{
    Byte b0 = i & 0xff;
    Byte b1 = i >> 8 & 0xff;
    Byte b2 = i >> 16 & 0xff;
    Byte b3 = i >> 24 & 0xff;
    // 有大小端模式問題?
    Byte result[] = {b0, b1, b2, b3};
    return [NSData dataWithBytes:result length:sizeof(result)];
}

三、附:大小端模式

  • 名詞解釋
大端模式:是指數據的高字節保存在內存的低地址中,而低子節數據保存在內存的高地址中。
小端模式:是指數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中。
  • 為什么會有大小端模式?
處理器(例如32位或者64位的cpu)的發展。
ARM芯片(iPhone)默認采用小端。
  • 驗證代碼

驗證方式1:(強轉)

short int a = 0x1122;     // 十進制為4386,其中11稱為高子節(即15~8位)。
char b = ((char *)&a)[0]; // 取變量a的低子節(即7~0位)
printf("%x", b);          // 輸出22代表編譯器為小端模式

驗證方式2:(便于理解)

int num = 0x12123678;                   // 十進制為305419896
char a = num & 0xff;                    // 取(0 ~ 7位)一個子節
char b = num >> 8 & 0xff;               // 取(8 ~15位)一個子節
char c = num >> 16 & 0xff;              // 取(16~23位)一個子節
char d = num >> 24 & 0xff;              // 取(24~31位)一個子節
printf("%x, %x, %x, %x", a, b, c, d);   // 小端模式將輸出78,56,34,12

驗證方式3:(利用共同體特性)

代碼參考下面推薦的文章(嵌入式)
  • 文章推薦
《詳解大端模式和小端模式》
http://blog.csdn.net/ce123_zhouwei/article/details/6971544
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • iPhone的標準推薦是CFNetwork 庫編程,其封裝好的開源庫是 cocoa AsyncSocket庫,用它...
    Ethan_Struggle閱讀 2,279評論 2 12
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,951評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,381評論 25 708
  • 18歲,林秋生第一次出遠門。 往年秋收后,父親和村里幾人結伴去外市的林場干活。以前都是和哥哥一起,今年哥哥結婚,分...
    清水小和尚閱讀 1,018評論 3 7
  • 意識到自己不能再陷下去,現階段應以努力工作增加學識能力為重,我決定還是去到佛山聽課,畢竟換一座城換一種心情,這也是...
    彭彭吃草莓閱讀 146評論 0 0