一道百度校招笔试题

要求是编码实现htons方法,将整数转换成适合传输的网络字节序。

这道题要考虑几个要点:

1. htons的签名式是怎样的?

2. 如何用C语言实现?

第一个问题考察你对socket编程是否了解,因为htons是Win socket库函数,专门用来转换字节序。实际上,htons是常用的转换函数之一,其它还有htonl、ntohs、ntohl等。函数名中h即host,n即network,s即short,l即long,因此htons函数的作用是将short类型的整数从主机字节序转换成网络字节序,签名式如下:

unsigned short htons(unsigned short);

第二个问题考察你对字节序的理解。何为主机字节序和网络字节序?字节序可以简单理解成为整型数据在内存中的摆放方式:小端字节序或大端字节序。常见的Intel X86是小端的,低位放在低字节;而IBM power PC是大端的,低位放在高字节。比如同样的0x0102,其小端字节序对应的内存布局是(0x02, 0x01),而大端字节序则相反,内存布局是(0x01, 0x02)。主机字节序指的就是本机采用的字节顺序。由于主机字节序有大端与小端之分,不同类型的主机之间要进行网络通信,就必须统一字节序。而网络字节序采用的是大端字节顺序。

经过上面的分析,可以列出基本思路:

1) 判断主机字节序类型,2)根据主机字节序类型进行转换,如为大端字节序直接返回,否则高低字节互换。

以下是一种实现方法:

unsigned short htons(unsigned short n)
{
	unsigned short us = 1;
	bool bigEndian = !((*(unsigned char*)&us) == 1);
	if (bigEndian) return n;
	return (((n&0x00FF)<<8) | ((n&0xFF00)>>8));
}

主机字节序的判断还可以采用下列方法:

	union {
		unsigned short n;
		unsigned char ch[2];
	} us;
	us.n = 1;
	bool bigEndian = !((us.ch[0]) == 1);

 

你可能感兴趣的:(一道百度校招笔试题)