进行网络编程时,经常会用到htonl,htons等字节转换操作,但好多时候用不着转换。哪位大侠能总结一下什么情况下必须转换,什么情况下不必转换.

解决方案 »

  1.   

    windows操作系统与unix、linux等操作系统有数据通信时,需要转换字节顺序。一般来讲,使用socket作通信为了程序的通用性,都会在发出数据时转为网络字节,在接收后转为主机字节来处理。
      

  2.   

    windows操作系统与unix、linux等操作系统有数据通信时,需要转换字节顺序。一般来讲,使用socket作通信为了程序的通用性,都会在发出数据时转为网络字节,在接收后转为主机字节来处理。
      

  3.   

    我知道linux和unix是使用高端编编,window使用低端编码,进行转换也就是把window的低端编码转换为unix的高端编码。我是想问这种转换是只针对数字的还是所有的数据类型。
      

  4.   

    对于socket编程,转换字节的几个地方:本地IP,本地端口,远端IP,远端端口,以及传送内容,特别是对于传送内容,要不是转换,如何转换,特别是有汉字和字母混合的地方.
      

  5.   

    首先是字与双字在各种系统中内部存储的方式的不同,在Windows中字与双字是高位在低地址排列的,而网络传输的标准是低位在低地址排列,比如一个十进制数字4660在Windows系统中存储成3412h,而在网络上表示是1234h。所以我们在设置或读取协议首部中有关用字或双字表示(一般象TCP中的端口、序号,而IP地址则不是)的字段时要切记转换他们的排列顺序
      

  6.   

    凡是要进行网络传送的时候都应该进行转换!只是对于作为数字解释的内容进行转换,比如int,long等。字符串信息不必转换。平时的程序都运行在同样的平台下,所以不转换的话问题也不大,不过如果你的程序日后要搬到其它平台运行,那就会出问题了,而且到时再改也不好改了。我自己就吃过这个亏,所以每当用网络传送数字时就作转换。
      

  7.   

    Tommy:
        你说的也不全对!linux和window系统存储的不同,只是体现在每个字的2个字节顺序上,比如16进制window下的FFEE存储成linux下的EEFF,而且我也看过htons()的函数实现,也只是简单地以字为单位交换2个字节的顺序.
      

  8.   

    我现在搞不明白,比如数字和汉字的混合字符串,如何才能正确地转换成网络字节顺序。TO Tommy:为什么字符串不必转换。另外谁知道操作系统如何识别汉字
      

  9.   

    alanfan:
        我就是这个意思。不同系统间就是字节顺序上的区别,x86是小头,就是低字节放在前面(就是你说的FFEE和EEFF),所以所谓的转换也只是将字节顺序作一下变换而已。比如,一个网络包有一个short PacketSize域,用来存放包的长度,那么在发送这个包前就应该作变换PacketSize=htons(PacketSize),接收之后也应该作变换PacketSize=ntohs(PacketSize),这样才能保证包长在不同的平台间能正确传送。
      网络上的数字是以大头字节顺序传送的,所以在x86平台上的htons和ntohs都会交换2个字节的顺序(htonl就是4个字节啦),然而在一些内部以大头存储的平台(如Tandem)上,这几个函数可能什么也不干了。alanfan:
        数字(short、long等)是以字(双字)为单位进行解释的,对于一个字(双字)中几个字节的具体含义(就是大头、小头等)会有不同的解释,所以才需要进行规范,变换为标准的格式。字符串是按字节流来解释的,也就是一个字节一个字节地解释,所以并不存在转换的问题。你提到的数字应该是ASC码的数字,如"1234"而不是一个short、long吧?这种情况的数字其实就是一个字符串,不必转换。
      操作系统对汉字的识别有多种方法,主要看汉字的编码方式。有些编码方式在汉字前有特殊的开始标志(如"~{"),看到这个标志就知道后面的是汉字了。有些编码方法则是用了大于128的字符作为编码,看到大于128的字符就与后面的字符一起作为一个汉字(所以如果中间缺了一个字符的话,字符的组合就乱了,就会出现乱码)。实际情况中可能还要更复杂,比如简、繁混排的话,由于两者的码集不完全一样,就要取一段文字,看看是按那种方式能解释得通了。具体的一些方法可以到网上找找,应该有的。
      

  10.   

    IP地址应该是int型。是不是操作系统给转换的,因为csocket中IP写成了字符串。对于发送的内容,如果是数字,接收以后还需要把其当成数字来用,就需要转换。发送内容为void*型。但我还没有试过能不能传二进行文件,理论上应该可以。