c# - 字节序、语言、硬件和网络

标签 c# java c++ networking programming-languages

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

由于 JVM,Java 始终是 Big-Endian。 由于协议(protocol)的原因,网络应该始终是大端。

  1. C、C++ 和 C# 取决于它们运行的​​计算机?
  2. 由于协议(protocol)的缘故,网络应该始终是 Big-Endian。如果我们在发送之前不调用 htons 和 htonl 会怎么样?如果发送方是 intel 机器上的 C++,则发送的数据将是 Little-endian。对吗?
  3. 所以我们不需要关心字节顺序(调用ntohl 和htonl),如果我们知道所有的客户端和服务器将使用具有相同体系结构的计算机并且将使用相同的程序语言。对吗?

最佳答案

  1. 至少对于 C 和 C++,是的;字节顺序通常取决于机器(但也可能取决于编译器)。对于 C#,我不知道。
  2. 很多网络协议(protocol)都是大端的,是的。如果您不调用 htonl,那么您将不会在小端机器上创建有效数据包。
  3. 因此您应该始终调用htonl 等(或您使用的任何语言中的等效项)。因为即使您今天的环境是同质的,但几乎可以肯定的是,将来这种情况会发生变化。

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

关于c# - 字节序、语言、硬件和网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932424/

相关文章:

c# - 有什么理由立即使用 await 和 async 吗?

java - Java 中使用 for 循环的多线程

c++ - 为什么在直接初始化和赋值中传递 lambda 而不是复制初始化时会编译?

c++ - 如何访问新的 c++11 标准大小的类型?

c# - 使用枚举类保持枚举到对象的映射?

c# - 在 javascript 中循环 C# 列表

c# - 将 Razor View Engine 与 Nancy 一起使用,.cshtml 不是可用的扩展名

Java:For循环不打印最后一次迭代

java - 变量自增而不实际改变它

c++ - 如何在不复制数据的情况下在平面数组和多维数组之间进行转换?