【问题标题】:ntohs() and ntohl() equivalent?ntohs() 和 ntohl() 等效?
【发布时间】:2011-01-26 02:06:06
【问题描述】:

C# 中有网络到主机的转换函数吗?谷歌搜索并没有找到太多。 :P

【问题讨论】:

    标签: c# htonl


    【解决方案1】:

    System.Memory nuget 包包括 System.Buffers.Binary.BinaryPrimitives 静态类,其中包括用于处理“字节顺序”的静态方法,包括 ReverseEndianness 的许多重载。在 dotnet core 上,HostToNetWorkOrder 是使用这些 ReverseEndianness 方法实现的。在 little-endian 架构(我认为所有支持 .NET)上,HostToNetworkOrderReverseEndianness 方法在 dotnetcore 上具有相同的性能。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 除了该类没有与 htonl 等效的功能。我必须获取字节,反转它们,然后转换回来
      • BitConverter 不支持任何非本地字节序。 (至少内置的没有,Jon 或 Marc 做了一个更强大的,但是制作垃圾临时数组仍然是一种浪费)
      【解决方案3】:

      IPAddress.HostToNetworkOrderIPAddress.NetworkToHostOrder?

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

      【讨论】:

      • 我假设这两种方法做同样的事情。我注意到重载仅适用于签名的东西。他们在未签名的东西上安全吗?
      • 首先 - 考虑到他们处理的很多事情都是未签名的 IP 地址之类的事情,令人惊讶的是 uint32 没有过载等。“安全”的意思是我很谨慎将有符号的强制转换为无符号,摆弄比特并回滚,一般来说,这是符号传播/截断的秘诀,... wiednesses
      • @SSpoke:ntohsntohl 都将是 NetworkToHostOrder,但对于不同的大小有不同的重载。
      • 该方法并不总是有效,甚至不会告诉您它可能会失败。我传入了一个 uint 我从 udp 套接字得到的,NetworkToHostOrder 不接受无符号数(因为无符号数不符合 CLS),并默默地将它们转换为 long,这显然是错误的。解决方案是使用BitConverter
      • @Leandros:听起来你应该做的只是转换为int,然后将结果转换回uint
      猜你喜欢
      • 2015-02-02
      • 1970-01-01
      • 2011-11-22
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多