【发布时间】:2011-01-26 02:06:06
【问题描述】:
C# 中有网络到主机的转换函数吗?谷歌搜索并没有找到太多。 :P
【问题讨论】:
C# 中有网络到主机的转换函数吗?谷歌搜索并没有找到太多。 :P
【问题讨论】:
System.Memory nuget 包包括 System.Buffers.Binary.BinaryPrimitives 静态类,其中包括用于处理“字节顺序”的静态方法,包括 ReverseEndianness 的许多重载。在 dotnet core 上,HostToNetWorkOrder 是使用这些 ReverseEndianness 方法实现的。在 little-endian 架构(我认为所有支持 .NET)上,HostToNetworkOrder 和 ReverseEndianness 方法在 dotnetcore 上具有相同的性能。
然而,在 dotnet 框架 (net461) 上,调用 HostToNetworkOrder 的性能比调用 ReverseEndianness 稍慢(不是 2 倍)。
我相信 JIT 编译器实际上是对这些方法进行特殊封装以调用 BSWAP x86 指令。如果您在自己的代码库中完全复制ReverseEndianness(long) 方法的实现,它将比调用System.Memory 实现慢近4 倍;暗示发生了 JIT 魔术。
【讨论】:
@jon-skeet's answer 根据您的问题是最准确的。但是,'ntoh_' 和 'hton_' C 函数被广泛用于在little-endian and big-endian computer architectures 之间进行转换。
如果您的意图是执行字节顺序转换,则有一个BitConverter class(核心程序集中的静态类)可以为您带来更合适的方式。特别是在:
【讨论】:
BitConverter 不支持任何非本地字节序。 (至少内置的没有,Jon 或 Marc 做了一个更强大的,但是制作垃圾临时数组仍然是一种浪费)
IPAddress.HostToNetworkOrder 和 IPAddress.NetworkToHostOrder?
每个方法都有 16、32 和 64 位整数的重载。
【讨论】:
ntohs 和 ntohl 都将是 NetworkToHostOrder,但对于不同的大小有不同的重载。
uint 我从 udp 套接字得到的,NetworkToHostOrder 不接受无符号数(因为无符号数不符合 CLS),并默默地将它们转换为 long,这显然是错误的。解决方案是使用BitConverter。
int,然后将结果转换回uint。