WinSock网络编程学习(三)判断主机字节序程序

什么是“字节序”?

在计算机网络中,通信是基于信息流的,不管是有线通信还是无线通信,那么数据在通道上传输时,就需要考虑一个问题:数据在传输时,正确的字节顺序是怎样的?收到的时候又该以怎样的顺序去解读它?

       当然,两种选择:一种是从数据的右端(最低有效位,又称为小端)开始,称为小尾数;另一种则是从左端(大端,最高有效位)开始顺序传输,称为大尾数。

吃鸡蛋的时候是先打破大端还是打破小端,因为这个问题还发生过一场战争呢!这个故事来自于《格列弗罗游记》,有兴趣的同学可以百度或谷歌一下,呵呵。

在我们性感的计算机的世界中,也出现了这样的问题,当然大家还是很friendly的哈!有的人支持小端先发送,有的人支持大端先发送。结果呢,小尾数和大尾数就同时并存,这样就对了嘛,于是它们之间在通信的时候需要翻译,于是就产生了一些处理器架构通过软件和硬件设置,能够在小尾数和大尾数之间进行切换,它们被称为“双尾数”。

计算机的字节序与CPU有关,不同的硬件平台,CPU的结构不同,内存中的字节序是不同的,两种表示方法:小尾数和大尾数。在你的机器网费到期或者扯开网线的情况下,不需要考虑与字节序相关的问题,计算机会自动选择用哪种方式存储数据,自得其乐。但是如果你的机器走出了家门来到了美丽的网络世界上,要考虑社交问题了,即字节序问题,这关乎到数据的读取,即能不不能听懂别人说的话。当两台计算机的字节序不同时,并且不做任何处理,双方交流就会出错。别人说“喜欢你”,而你却理解成了“你欢喜”,于是一段基情就错过了,呵呵。

实际上,使用什么字节序并不重要。重要的是大家能够选择一种,一起遵守这个协议,便于沟通就好了。

HostEndian.c:

#include<stdio.h>

union endian_u
{
	unsigned short sval;
	unsigned char cval[2];
};

void main( )
{
	char* info = "unknow endian";
	union endian_u t= {0x1234};
	char r;
	if(t.cval[0] == 0x12 && t.cval[1] == 0x34)
	{
		info = "big-endian";
	}
	else if(t.cval[0] == 0x34 && t.cval[1] == 0x12)
		info = "little-endian";
	printf("host is %s.\n",info);
	//scanf("%c",&r);
}

你可能感兴趣的:(互联网,网络,计算机,网络编程,网络世界)