zoukankan      html  css  js  c++  java
  • iOS IM开发准备工作(五)iOS中的struct怎么处理

      iOS中需要处理结构体的机会应该不多:Blueteeth or socket and so on。。。

      不过,有一天你还是会遇到的。

    定长结构体

      所谓定长的结构体是,结构体内每一个字段都规定了字节长度。如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来计算。

      

  • 相关阅读:
    python的正负无穷float("inf")的用法
    python中几个常见的黑盒子之“字典dict” 与 “集合set”
    python中几个常见的“黑盒子”之 列表list
    Python 排序---sort与sorted学习
    django中使用Profile扩展User模块(基于django 1.10版本下)
    获取Linux进程运行在哪个CPU内核上面的方法
    【转】Crontab定时任务配置
    【转】sudo命令情景分析
    【转】详解Python的装饰器
    一步步来配置安卓开发环境ADTBundle
  • 原文地址:https://www.cnblogs.com/akforsure/p/5292146.html
Copyright © 2011-2022 走看看