//包头: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;
【原文:http://blog.csdn.net/itianyi/article/details/8731678】