网络字节序的转换再分析

本文深入探讨了网络通信中字节序转换的重要性,以quint16类型的变量为例,展示了在小端法主机上htons和ntohs函数如何进行字节序转换。分析指出,发送端使用htons()确保数据以网络字节序(大端序)发送,接收端则通过ntohs()将接收到的数据转换为主机字节序。总结了在不同主机字节序环境下,这两个函数的作用,并强调了在网络编程中保持字节序一致性的必要性。
摘要由CSDN通过智能技术生成

我们在本文中已经分析了网络通信中,为保持报文顺序一致,而需要进行字节序转换。

本文对字节序转换再进行分析:

    quint16 wCRC = 0xAA01;

    uchar* pSendBuf = (uchar*)malloc(2 * sizeof(uchar));
    memcpy(pSendBuf, &wCRC, sizeof(quint16));//memcpy会按照主机序将字节拷贝到内存中
    printf("pSendBuf[0]:%02x\n",pSendBuf[0]);//01
    printf("pSendBuf[1]:%02x\n",pSendBuf[1]);//aa

    quint16 value = *(quint16*)(pSendBuf);//直接取的话,也会按照主机字节序来取
    printf("memcpy:%04x\n",value);//aa01

    quint16 value_1 = htons(value);//主机字节序转换成网络字节续
    printf("htons:%04x\n",value_1);//01aa

    quint16 value_2 = ntohs(value);
    printf("ntohs:%04x\n",value_2);
    fflush(stdout);

 分析:

1)由pSendBuf[0],存储的时01,pSendBuf[1]存储的是AA,我们可以知道本机字节序是小端法排序

2)htons(value)之后,转化为网络字节序(大端法排序),故字节顺序肯定颠倒了。

3)ntohs(value)之后,网络字节续(大端法排序)转为为主机字节序(小端法排序),故字节顺序肯定颠倒。

小结:

网络字节序是大端序,这个时固定的!

主机序可能是大端序,也可能是小端序,当是大端序时,htons,ntohs,不起作用;

当是小端序时,htons会交换quint16 两个字节位置。(小端转大端)

ntohs也会交换quint16两个字节位置,效果同htons,可以通过上述的示例,htons、ntohs结果都是aa01验证。(大端转小端)

再分析:

网络编程中,为保证发送端和接收端字节序保持一致,以发送的报文0xAA01为例,

我们在发送端使用htons(),保证报文中存储的是0xAA ,0x01;

我们在接收端使用ntohs(),保证将报文中0xAA,0x01转换为主机字节序(假设,接收端主机是大端,那么调用ntohs未起作用,假设接收端主机是小端,通过quint16_t强转后,变为01AA, 再次调用ntohs后,字节转换变为AA01

结论:

1)当主机是小端法排序时,无论使用htons还是ntohs都会将uint16_t的两个字节转换位置。由本文知二者其实是同一个宏。

2)网络编程中,使用htons和ntohs,都是为了将字节序转为大端序,发送端htons(),转为大端序,memcpy到报文中发送;

接收端通过 uint16_t取出后,经过ntohs()转换为大端序。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值