iOS网络字节序列转换

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];

当接收到服务器返回数据的时候记得要转成本地字节序.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值