.NET MAUI中IPAddress.NetworkToHostOrder函数不符合预期问题
问题分析与解决
你的问题根源在于误用了IPAddress.NetworkToHostOrder的重载方法,导致字节序转换逻辑错误。
错误原因
IPAddress.NetworkToHostOrder没有针对ushort的重载,当你传入ushort类型的值时,会被隐式转换为int,进而调用32位整数版本的重载。该版本会对整个32位数据进行字节序翻转,而不是你需要的16位数据翻转:
- 以你得到的
udpPacketLength = 9217(十六进制0x00002401)为例,经过32位字节序翻转后会变成0x01240000,转换回ushort时仅保留低16位(0x0000),最终结果就是0。 - 其他字段(源端口、目的端口、校验和)得到0的原因完全相同。
修正代码
处理16位无符号数据时,需要先将其转换为short,调用16位整数版本的重载,再转换回ushort:
//byte[] ipPorts = pcapngReader.ReadBytes(4); ushort udpSourcePort = (ushort)IPAddress.NetworkToHostOrder((short)pcapngReader.ReadUInt16()); pcapngUDPPacketPosition += sizeof(ushort); ushort udpDestinationPort = (ushort)IPAddress.NetworkToHostOrder((short)pcapngReader.ReadUInt16()); pcapngUDPPacketPosition += sizeof(ushort); ushort udpPacketLength = pcapngReader.ReadUInt16(); ushort udpPatketLengthHostOrder = (ushort)IPAddress.NetworkToHostOrder((short)udpPacketLength); pcapngUDPPacketPosition += sizeof(Int16); ushort udpPacketChecksum = (ushort)IPAddress.NetworkToHostOrder((short)pcapngReader.ReadUInt16()); pcapngUDPPacketPosition += sizeof(Int16);
验证逻辑
以你提到的UDP包长为例:
- pcapng中原始数据是
0x0124(十进制292,网络字节序) pcapngReader.ReadUInt16()按小端读取得到0x2401(十进制9217)- 转换为
short后调用NetworkToHostOrder,对16位数据翻转字节序,得到0x0124(十进制292) - 转换回
ushort后就是你期望的正确值。
同样,源端口0x1381(十进制4993)经过修正后的代码处理后,也会得到正确的结果。
内容的提问来源于stack exchange,提问作者ScooterTechnologies
相关产品推荐
相关产品推荐

