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