大端字节序与小端字节序
- 1. 简介
- 2. 判断机器字节序(C/C++)
- 3. 主机字节序与网络字节序的转换
- 4. IP地址与网络字节序的转换
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)