大端字节序与小端字节序 (网络字节序与主机字节序)

1. 简介

       字节序分为大端字节序(big endian)和小端字节序(little endian)。

       大端字节序是指一个整数的高位字节(23 ~ 31bit)存储在内存的低地址处,低位字节(0 ~ 7bit)存储在内存的高地址处。(高位在前,低位在后)
       小端字节序则是指整数的高位字节存储在内存的高地址位,而低位字节则存储在内存的低地址处。(高位在后,低位在前)

       因为计算机电路先处理低位字节,效率比较高,计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。所以小端字节序也被称为主机字节序。但是,人类还是习惯读写大端字节序。一般,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。所以大端字节序被称为网络字节序。

举例:0x01234567的两种表示
在这里插入图片描述

2. 判断机器字节序(C/C++)

#include <iostream>
using namespace std;
void byteorder(){
    
    
    union{
    
    
        short value;
        char union_bytes[sizeof(short)];
    }test;
    test.value = 0x0102;

    if((test.union_bytes[0] == 1) && (test.union_bytes[1] == 2)){
    
    
        cout << "big endian" << endl;
    }else if((test.union_bytes[0] == 2) && (test.union_bytes[1] == 1)){
    
    
        cout << "little endian" << endl;
    }else{
    
    
        cout << "unknown..." << endl;
    }
}

int main(){
    
    
    byteorder();
    return 0;
}

3. 主机字节序与网络字节序的转换

#include <netinet.in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int htonl(unsigned long int netlong);
unsigned short int htons(unsigned short int netshort);
  • htonl表示“host to network long” ,即将长整型(32bit)的主机字节序转换为网络字节序
  • 长整型函数用来转换IP地址,短整型函数用来转换端口号(不限于此)

4. IP地址与网络字节序的转换

#include <arpa/inet.h>
int inet_pton(int af,const char* src,void* dst);
const char* inet_ntop(int af,const void* src,char* dst,socklen_t cnt);
  • inet_pton函数
    • 把用字符串表示的IP地址src(点分十进制表示的IPV4,IPV6)转换为网络字节序整数表示的IP地址,并把转换结果存储与dst指向的内存中。
    • af表示地址族(AF_INET | AF_INET6)
    • 成功返回1,失败返回0并设置errno
  • inet_ntop函数
    • 进行相反操作,cnt指定目标存储单元的大小
    • 成功返回目标存储单元的地址,失败返回NULL,并设置errno

下面两个宏帮助我们指定目标存储单元cnt的大小:

#include <netinet/in.h>
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46

【图片来源】:https://www.cnblogs.com/gremount/p/8830707.html

おすすめ

転載: blog.csdn.net/weixin_44515978/article/details/121730568