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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它...
    Ethan_Struggle阅读 2,230评论 2 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,825评论 25 707
  • 18岁,林秋生第一次出远门。 往年秋收后,父亲和村里几人结伴去外市的林场干活。以前都是和哥哥一起,今年哥哥结婚,分...
    清水小和尚阅读 982评论 3 7
  • 意识到自己不能再陷下去,现阶段应以努力工作增加学识能力为重,我决定还是去到佛山听课,毕竟换一座城换一种心情,这也是...
    彭彭吃草莓阅读 142评论 0 0