1. 对字节序的理解
endian指内存地址的低地址端,即内存地址增长的起始端。
little-endian: little指数据的低位字节,指低位字节存放在内存的低地址端,相应的高位字节存放在内存的高地址端;
big-endian: big指数据的高位字节,big-endian指高位字节存放在内存的低地址端,相应的低位字节存放在内存的高地址端。
网络字节序采用的是big_endian的字节序,符合人类的从左向右读数的习惯,即内存地址从小到大增长,读数也是从左向右读取。
需要转换的数据只限于对于多字节的整数,浮点数和字符串有一套独立的数据编码,不需要转换。
2. 主机字节序与网络字节序的互换函数(只有多字节整型数据需转换)
头文件<netinet/ih.h>
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
#include<netinet/in.h>
int main(int argc,char** argv)
{
short num = 0x1234;
{
printf("big endian\n");
}
else
{
printf("little endian\n")
}
exit(0);
}
endian指内存地址的低地址端,即内存地址增长的起始端。
little-endian: little指数据的低位字节,指低位字节存放在内存的低地址端,相应的高位字节存放在内存的高地址端;
big-endian: big指数据的高位字节,big-endian指高位字节存放在内存的低地址端,相应的低位字节存放在内存的高地址端。
网络字节序采用的是big_endian的字节序,符合人类的从左向右读数的习惯,即内存地址从小到大增长,读数也是从左向右读取。
需要转换的数据只限于对于多字节的整数,浮点数和字符串有一套独立的数据编码,不需要转换。
2. 主机字节序与网络字节序的互换函数(只有多字节整型数据需转换)
头文件<netinet/ih.h>
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
3. 根据大小端的定义写出测试一台机器是大小端的简单方法
#include<stdio.h>#include<netinet/in.h>
int main(int argc,char** argv)
{
short num = 0x1234;
unsigned char* ptr = (unsigned char*)(&num);
printf("[0]: 0x%X addr:%u\n", pc[0], &pc[0]);
printf("[1]: 0x%X addr:%u\n", pc[1], &pc[1]);
{
printf("big endian\n");
}
else
{
printf("little endian\n")
}
exit(0);
}