字节序,语言,硬件和网络

5Yr*_*DBA 3 c# c++ java networking programming-languages

我们知道endian与计算机存储数据的方式有关.大端计算机体系结构包括IBM 370,Motorola 68000和Sun Sparc.小端计算机包括intel系列(80486,pentium等)和VAX.

由于JVM,Java始终是Big-Endian.由于协议,网络应该始终是Big-Endian.

  1. C,C++和C#depand在他们运行的计算机上?
  2. 由于协议,网络应该始终是Big-Endian.如果我们在发送之前不调用htons和htonl怎么样?如果发送者是英特尔计算机上的C++,则发送的数据将是Little-endian.这样对吗?
  3. 因此,如果我们知道所有客户端和服务器将使用具有相同体系结构的计算机并且将使用相同的程序语言,那么我们不需要关心字节序(调用ntohl和htonl).这样对吗?

Oli*_*rth 8

  1. 对于C和C++,至少,是的; 字节序通常取决于机器(但也可能取决于编译器).对于C#,我不知道.
  2. 许多网络协议都是大端的,是的.如果您不打电话htonl,那么您将无法在小端机器上创建有效数据包.
  3. 因此,您应该总是打电话htonl等(或者使用您使用的任何语言的等效语句).因为即使你今天拥有一个同质的环境,几乎可以肯定,在将来,这将会发生变化.

更具体地说,您应该始终尽可能靠近界面进行转换,并且在一个地方.如果您的代码库中遍布了字节顺序转换调用,则很难判断您的代码是否合理.