You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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包长为例:

  1. pcapng中原始数据是0x0124(十进制292,网络字节序)
  2. pcapngReader.ReadUInt16()按小端读取得到0x2401(十进制9217)
  3. 转换为short后调用NetworkToHostOrder,对16位数据翻转字节序,得到0x0124(十进制292)
  4. 转换回ushort后就是你期望的正确值。

同样,源端口0x1381(十进制4993)经过修正后的代码处理后,也会得到正确的结果。

内容的提问来源于stack exchange,提问作者ScooterTechnologies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:13:18