ntohs()和ntohl()等价?

bob*_*205 32 c# htonl

在C#中是否有网络主机转换功能?谷歌搜索并没有找到太多.:P

Jon*_*eet 41

IPAddress.HostToNetworkOrderIPAddress.NetworkToHostOrder

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

  • 该方法并不总是有效,甚至不会告诉您它可能会失败。我传递的是从 udp 套接字获得的“uint”,而“NetworkToHostOrder”不接受无符号(因为无符号数字不符合 CLS),并默默地将它们转换为“long”,这显然是错误的。解决方案是使用“BitConverter”。 (2认同)
  • @Leandros:听起来你应该做的只是转换为`int`,然后将结果转换回`uint`。 (2认同)

Mar*_*lug 5

System.Memory nuget 包包含静态类,其中包含用于处理“字节顺序”的静态方法,包括. 在dotnet core上,是使用这些方法实现的。在小端架构(我认为这是所有支持 .NET 的架构)上,方法在 dotnetcore 上具有相同的性能。System.Buffers.Binary.BinaryPrimitivesReverseEndiannessHostToNetWorkOrderReverseEndiannessHostToNetworkOrderReverseEndianness

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

我相信 JIT 编译器实际上是对这些方法进行特殊封装以调用 BSWAP x86 指令。如果您在自己的代码库中精确复制该方法的实现ReverseEndianness(long),那么它会比调用该System.Memory实现慢近 4 倍;这表明 JIT 魔法正在发生。