OC中网络传输的时候对字节流的操作 & 对字节的处理 & 野指针问题

//包头:42个字节,第一个字节【目前基本上没用到,无需理会】,第二个字节【表示session的长度】,3-6字节【内容的长度】,最后36字节【客户端发送请求时的标示,当服务端返回结果时,客户端用来表示是哪个请求的返回结果。就是一个GUIDUUID

    char first = target.isPrice;           //1个字节,暂时没有用到

    char second = [target.session length];  //2个字节

    int third = [target.content length];    //3-6个字节

    NSData *four = [target.invokeIddataUsingEncoding:NSASCIIStringEncoding];//最后36个字节是一个invokeIduuid字串,字串使用ASCII编码

//    const char *fourth = [target.invokeId UTF8String];

    

    NSMutableData *data = [[NSMutableDataalloc]init];

    [data appendBytes:&first length:sizeof(first)];

    [data appendBytes:&second length:sizeof(second)];

    [data appendBytes:&third length:sizeof(third)];

    [data appendData:four];

    [data appendData:target.content];//content默认就是使用utf8编码

    

    //重点是对于uuid的操作,第7-42字节就是一个uuid的字串,下面的uuid于guid 2种方式都可以顺利的取出包种的uuid,并转换成字串

    int pkgCount;

    char char1,char2;

    char *uuid = malloc(36); //使用自己申请的一块buffer来存放uuid,记得不用的时候要手动释放掉此块内存,因为arc对于c语言是没有用的。

    char guid[36]; //直接使用数组来存放uuid


    [data getBytes:uuidrange:NSMakeRange(6,36)];

    NSData *uuidData = [NSData dataWithBytes:uuid length:sizeof(uuid)];//注意:这里不能使用sizeof(uuid)因为uuid是一个指针,永远是4个字节,这里必须制定大小为36才对

    NSString *uuidStr = [[NSStringalloc]initWithData:uuidDataencoding:NSUTF8StringEncoding];

    free(uuid);//如果不释放,直接把指针置空,就会内存泄露

    uuid = NULL;//指针指向的内容释放之后,要把指针置为空,防止野指针

        从这里看处,还是使用guid[36]方便,不用管内存的释放问题。


    [data getBytes:guidrange:NSMakeRange(6,36)];

    NSData *guidData = [NSData dataWithBytes:guid length:sizeof(guid)];

    NSString *guidStr = [[NSStringalloc]initWithData:guidDataencoding:NSUTF8StringEncoding];

  

    NSData *dataContent = [data subdataWithRange:NSMakeRange(42, [datalength]-42)];//从第42个字节开始到最后是内容

    NSString *msg = [[NSStringalloc]initWithData:dataContentencoding:NSUTF8StringEncoding];    

    return data;


野指针问题:内存释放之后,要记得把指针置为null,防止野指针问题


【原文:http://blog.csdn.net/itianyi/article/details/8731678】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值