十进制数转IP地址结果不一致:PowerShell与在线工具差异咨询
十进制转IPv4结果不一致的原因及解决方法
你的问题核心是字节序(端序)的差异:PowerShell的[IPAddress]类使用主机字节序(小端)解析整数,而标准的IPv4十进制转IP应该遵循网络字节序(大端)。
结果正确性说明
- 在线工具给出的
1.0.136.11是符合IPv4标准的正确结果(遵循网络字节序)。 - PowerShell返回的
11.136.0.1是因为Windows系统为小端字节序,[IPAddress]构造函数将整数按主机字节序拆分,导致字节顺序反转。
验证计算过程
以十进制数16812043为例:
- 转换为十六进制:
0x0100880B - 按**网络字节序(大端)**拆分(从高位到低位取8位):
- 最高8位:
0x01→ 1 - 次高8位:
0x00→ 0 - 次低8位:
0x88→ 136 - 最低8位:
0x0B→ 11 - 组合后:
1.0.136.11
- 最高8位:
- 按**主机字节序(小端)**拆分(反转字节顺序):
- 原十六进制字节顺序为
01 00 88 0B,反转后为0B 88 00 01 - 对应十进制:11、136、0、1
- 组合后:
11.136.0.1(即PowerShell的结果)
- 原十六进制字节顺序为
修改后的函数(符合标准网络字节序)
如果需要得到标准的IPv4结果,替换原函数为手动按大端拆分字节的版本:
function Convert-NumberToIP { param( [Parameter(Mandatory=$true)][string]$number ) [Int64] $numberInt = 0 if([Int64]::TryParse($number, [ref]$numberInt) -and $numberInt -ge 0 -and $numberInt -le 0xFFFFFFFFl) { # 按网络字节序(大端)拆分32位整数 $byte1 = ($numberInt -shr 24) -band 0xFF $byte2 = ($numberInt -shr 16) -band 0xFF $byte3 = ($numberInt -shr 8) -band 0xFF $byte4 = $numberInt -band 0xFF "$byte1.$byte2.$byte3.$byte4" } } # 测试 Convert-NumberToIP -number 16812043
运行后将返回标准结果1.0.136.11。
内容的提问来源于stack exchange,提问作者Naveen Kumar
相关产品推荐
相关产品推荐

