C# 如何将端口号转换为网络字节顺序?
我正在编写一个程序,用于确定C#Net中端口的进程id 在C# 如何将端口号转换为网络字节顺序?,c#,.net,network-programming,C#,.net,Network Programming,我正在编写一个程序,用于确定C#Net中端口的进程id 在iphlapi.dll中有一个函数GetExtendedTcpTable,它返回TcpTable。获取表后,我将遍历行并解析端口号 现在,为了比较端口号,我使用IPAddress.HostToNetworkOrder将27144端口号转换为网络字节顺序,并使用Marshal.ReadInt32与其他端口号进行比较。这种比较是行不通的。i、 没有结果匹配 如果不使用IPAddress.HostToNetworkOrder,我将使用以下逻辑
iphlapi.dll
中有一个函数GetExtendedTcpTable
,它返回TcpTable。获取表后,我将遍历行并解析端口号
现在,为了比较端口号,我使用IPAddress.HostToNetworkOrder
将27144端口号转换为网络字节顺序,并使用Marshal.ReadInt32
与其他端口号进行比较。这种比较是行不通的。i、 没有结果匹配
如果不使用IPAddress.HostToNetworkOrder
,我将使用以下逻辑
((27144 & 0xFF) << 8) + ((27144 & 0xFF00) >> 8) == Marshal.ReadInt32(portAddress)
((27144&0xFF)>8)=封送处理ReadInt32(portAddress)
我能够确定流程id,即其中一个结果匹配
您能告诉我为什么
IPAddress.HostToNetworkOrder
不起作用吗?您可能在中使用了dwLocalPort
/dwRemotePort
中的DWORD
。DWORD肯定不会是16位的,您可能会将其称为32位版本的。。。在使用IPAddress.HostToNetworkOrder
函数之前,您应该尝试将其强制转换为Int16
。参考:@utopiangoven:useInt16
返回-5527
并使用原样值,即Int32
返回-362217472
。而当我使用移位逻辑时,返回的值是60009
@jags:You'sneep's。。。请注意-5527+(2^16)=60009
。您需要使用IPAddress.HostToNetworkOrder的Int16
版本(因为UInt16
不可用),然后将它们作为UInt16
s进行比较。将结果转换为UInt16
后,我得到60009
。因此,Int32
的符号性质让我感到困惑。非常感谢。我将学习更多关于这方面的东西,以供我自己学习。