iOS IM开发准备工作(五)iOS中的struct怎么处理
2016-03-18 15:01
585 查看
iOS中需要处理结构体的机会应该不多:Blueteeth or socket and so on。。。
不过,有一天你还是会遇到的。
个人觉得,结构体是一段有序的二进制文本。也就是它的每一个字段都是按顺序排列的。
上面两段代码可以看出,定长结构体的每一个字段都可以用相应的方法直接赋值,转化为二进制的长度也是固定的。那如果是接受到的结构体,该怎么取值呢?
不定长的处理,关系到结构体的大小。
反之接受的处理和定长的一样。不过不定长的那个字段的长度,需要通过length来计算。
不过,有一天你还是会遇到的。
定长结构体
所谓定长的结构体是,结构体内每一个字段都规定了字节长度。如int、long、double、char[32]等等。下面是一个定长结构体的例子。typedef struct tagInfo { int nFace; long cmd; char sNickName[60]; char sAccountNo[60]; }T_INFO,*PT_INFO;
个人觉得,结构体是一段有序的二进制文本。也就是它的每一个字段都是按顺序排列的。
// 赋值 tagInfo * tinfo; tinfo->nFace = 0; memcpy(tinfo->sAccountNo, [@"xxx" UTF8String], 60); memcpy(tinfo->sNickName, [@"xxx" UTF8String], 60); tinfo->cmd = 10;
// 处理成二进制 用来发送 NSData * sendData = [[NSData alloc]initWithBytes:tinfo length:sizeof(tinfo)];
上面两段代码可以看出,定长结构体的每一个字段都可以用相应的方法直接赋值,转化为二进制的长度也是固定的。那如果是接受到的结构体,该怎么取值呢?
// 处理接受到的数据 NSData * receiveData;// 你收到的数据 char * k = new char[receiveData.length]; if(k) {//是否为空 tagInfo * tinfo = new (k)tagInfo(); [receiveData getBytes:tinfo length:receiveData.length]; // 字符串是需要转换的 NSString * name = [[NSString alloc]initWithBytes:tinfo->sNickName length:64 encoding:NSUTF8StringEncoding]; NSString * accountNo = [[NSString alloc]initWithBytes:tinfo->sAccountNo length:64 encoding:NSUTF8StringEncoding]; int face = tinfo->nFace; long cmd = tinfo->cmd; }
不定长结构体
这个使用的比较多。因为每次发送的消息长度都是不一样的,太长浪费流量,太短消息内容少。typedef struct tagInfo { int nFace; long cmd; int length; char sNickName[60]; char sAccountNo[60]; char exInfo[1]; // 这个就是不定长的内容 }T_INFO,*PT_INFO;
不定长的处理,关系到结构体的大小。
// 赋值 data 为不定长的数据 NSData类型 char * l = new char[data.length+sizeof(tagInfo)]; if(l){ memset(l, 0, data.length+sizeof(tagInfo)); tagInfo * ksm = new(l) tagInfo(); // 算出结构体的长度 这个很关键 ksm->length = (uint32_t)(data.length) + (sizeof(tagInfo)); // 填充定长字段 刚才那几个字段 ksm->nFace = 0; ksm->cmd = 11; ... ... // 将不定长的数据拷贝到对应的地方 memcpy(ksm->bData, data.bytes, data.length); // 转换为可以发送的二进制 NSData * returnData = [[NSData alloc]initWithBytes:ksm length:ksm.length]; }
反之接受的处理和定长的一样。不过不定长的那个字段的长度,需要通过length来计算。
相关文章推荐
- 热门IOS 第三方库
- 【iOS学习】十一、ActionSheet
- iOS边练边学--简单的数据操作(增、删、改),左滑动删除和弹窗
- iOS-代码修改Info.plist文件
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解[转]
- nagios-安装配置
- IOSGCD
- ios: Base SDK和Deployment Target
- ios 模态半透明弹出框
- iOS 证书
- 【整理】BIOS、BootLoader、uboot对比
- ios 字符串转date,模拟器ok,真机不ok,
- iOS核心动画高级技巧一
- iOS计时器NSTimer的使用
- nagios监控系统安装
- iOS-----About Asset Catalog
- nagios短信监控
- ios开发中,联系人列表是怎样通过名字排序分组的(支持中文排序)
- IOS项目自动生成技术文档很方便实用
- iOS模拟Tom猫的简单界面