4.10、字节序列转换函数

1.字节序转换函数

  • 当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误的解释之。解决问题的方法是:发送端总是把要发送的数据转换成大端字节序数据后再发送,而接收端知道对方传送过来的数据总是采用大端字节序,所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行转换(小端机转换,大端机不转换)。
  • 网络字节顺序是 TCP/IP 中规定好的一种数据表示格式,它与具体的 CPU 类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用大端排序方式。
  • BSD Socket提供了封装好的转换接口,方便程序员使用。包括从主机字节序到网络字节序的转换函数:htonshtonl;从网络字节序到主机字节序的转换函数:ntohsntohl

2.字节序转换函数有哪些

h - host 主机,主机字节序
to - 转换成什么
n - network 网络字节序
s - short unsigned short
l - long unsigned int

#include <arpa/inet.h>
// 转换端口
uint16_t htons(uint16_t hostshort); // 主机字节序 - 网络字节序
uint16_t ntohs(uint16_t netshort); // 网络字节序 - 主机字节序
// 转IP
uint32_t htonl(uint32_t hostlong); // 主机字节序 - 网络字节序
uint32_t ntohl(uint32_t netlong); // 网络字节序 - 主机字节序

3.字节序转换函数的使用

#include <iostream>
#include <arpa/inet.h>

using namespace std;

int main()
{
    
    
    // 创建一个两个字节的数据
    unsigned short a = 0x0102;
    // 转换一下将每个字节分开
    unsigned char * stra = (unsigned char *)&a;
    printf("%d %d\n", stra[0], stra[1]);


    // 将数据转换为大端存储方式(电脑为大端不需要改变)
    uint16_t aa = htons(a);
    // 将转换之后的结果字节分开
    stra = (unsigned char *)&aa;
    printf("%d %d\n", stra[0], stra[1]);

    cout << "--------------------------------------" << endl;

    // 创建一个ip形式的数据
    unsigned char* strb = new unsigned char [4]{
    
    192, 168, 1, 25};
    unsigned int b = *(unsigned int * )strb;
    printf("%x\n", b);
    printf("%d %d %d %d\n", strb[0], strb[1], strb[2], strb[3]);

    unsigned int bb = ntohl(b);
    printf("%x\n", bb);
    strb = (unsigned char * )&bb;
    printf("%d %d %d %d\n", strb[0], strb[1], strb[2], strb[3]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/z2812470857/article/details/130168049