在操作系统中,有大端存储和小端存储两种主要的存储方式。在不同的系统间进行数据传输时,需 要注意进行本机字节序和网络字节序之间的相互转换。在调用 recv或 read 函数从外部系统接收数据 后,如果不调用ntohs 或 ntohl 函数将网络字节序转换为本地字节序,会造成数据错误,进而导致预料之 外的行为。
对于从外部系统接收的数据应该转换为本地字节序的情况,示例1给出了不规范用法(C/ 语言)示 例。示例2给出了规范用法(C/C++ 语言)示例。
示例1:
int bad1(int s){
short u;
recv(s,&u,sizeof(u),0);
return u- 12;//<==error
}
在调用 recv 函数之前,没有调用ntohs 或 ntohl 函数将 u 转换为网络字节序。
从外部系统接收数据后调用系统 API(ntohs、ntohl)进行数据字节序转换,然后再使用。
示例2:
int good1(int ss){
short uu;
recv(ss,&uu,sizeof(uu),0);
short vv = ntohs(uu);
return vv - 12;
}