您的位置:首页 > 理论基础 > 计算机网络

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

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

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

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

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

NSData *four = [target.invokeIddataUsingEncoding:NSASCIIStringEncoding];//最后36个字节是一个invokeId的uuid字串,字串使用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默认就是使用utf-8编码

//重点是对于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】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: