ntohs()和ntohl()等价?

时间:2010-03-10 20:12:15

标签: c# htonl

C#中是否有net to host转换功能?谷歌搜索并没有找到太多。 :P

3 个答案:

答案 0 :(得分:39)

IPAddress.HostToNetworkOrderIPAddress.NetworkToHostOrder

每个方法都有16,32和64位整数的重载。

答案 1 :(得分:1)

根据您的问题,

@jon-skeet's answer是最准确的。但是,'ntoh_'和'hton_'C函数被广泛用于在little-endian and big-endian computer architectures之间进行转换。

如果您的意图执行字节序转换,则会有一个BitConverter class(核心程序集中的静态类)为您提供更合适的方式。特别是在:

  • 使用字节数组(广泛用于文件或网络流)。
  • Detecting endianess运行时机器的体系结构。
  • 将基本结构转换为整数(布尔值,小数)而不进行类型转换。
  • 您的代码与网络操作无关(System.Net命名空间)。

答案 2 :(得分:0)

System.Memory nuget包包括System.Buffers.Binary.BinaryPrimitives静态类,该类包括用于处理“字节序”的静态方法,其中包括ReverseEndianness的许多重载。在dotnet核心上,HostToNetWorkOrder是使用这些ReverseEndianness方法实现的。在小字节序的体系结构(我认为是全部支持.NET)上,HostToNetworkOrderReverseEndianness方法在dotnetcore上具有相同的性能。

在dotnet框架(net461)上,调用HostToNetworkOrder的性能比调用ReverseEndianness稍慢(不是2倍)。

我相信JIT编译器实际上是这些方法的特殊封装,以调用BSWAP x86指令。如果您在自己的代码库中完全复制ReverseEndianness(long)方法的实现,则它的速度将比调用System.Memory实现的速度慢将近4倍;提示正在发生准时制魔术。