iOS网络字节序列转换
最近项目使用字节流的方式传输数据,数据包中包含数据的大小等相关的一些基础信息需要将字节转换成网络字节流的方式进行传输,因为之前一直使用的是Http或者用分隔符的方式去解决socket传输中引起的粘包问题,第一次接触网络字节流的概念.后来查询才知道原来对于不同的系统和不同的cpu中转换相同的数据可能大端和小端在字节的排序是不一致的,为了保持统一,出来了一个网络字节流的标准。
在iOS中是有自带的方法去进行转换的,但是在使用的时候要注意转换所要求的长度。
#define NTOHL(x) (x) = ntohl((__uint32_t)x) //转换成本地字节流
#define NTOHS(x) (x) = ntohs((__uint16_t)x) //转换成本地字节流
#define NTOHLL(x) (x) = ntohll((__uint64_t)x) //转换成本地字节流
#define HTONL(x) (x) = htonl((__uint32_t)x) //转换成网络字节流
#define HTONS(x) (x) = htons((__uint16_t)x) //转换成网络字节流
#define HTONLL(x) (x) = htonll((__uint64_t)x) //转换网络字节流
//HTONL 转换成网络字节序
int32_t packetlength = 0;
int16_t headerLength = 0;
int16_t version = 1;
int32_t commandID = CMD_ID_AUTH_TOKEN_REQ;
int32_t seqNo = 1;
HTONL(commandID);
NSData *commonData = [NSData dataWithBytes:&commandID length:sizeof(commandID)];
HTONS(version);
NSData *versionData = [NSData dataWithBytes:&version length:sizeof(version)];
HTONL(seqNo);
NSData *seqNoData = [NSData dataWithBytes:&seqNo length:sizeof(seqNo)];
headerLength = versionData.length + commonData.length + seqNoData.length;
HTONS(headerLength);
NSData *headerData = [NSData dataWithBytes:&headerLength length:sizeof(headerLength)];
packetlength = NTOHS(headerLength) + headerData.length+fileData.length;
HTONL(packetlength);
NSData *packetLengthData = [NSData dataWithBytes:&packetlength length:sizeof(packetlength)];
NSMutableData *mdata = [NSMutableData data];
[mdata appendData:packetLengthData];
[mdata appendData:headerData];
[mdata appendData:versionData];
[mdata appendData:commonData];
[mdata appendData:seqNoData];
[mdata appendData:fileData];
当接收到服务器返回数据的时候记得要转成本地字节序.