PowerShell force [int]包装(IP到Long转换)

时间:2014-01-05 10:23:10

标签: powershell ip int

这是一个简单的问题,因为我对PowerShell中的数学有点新鲜

我需要在PowerShell中创建一个将IP转换为Long的转换器。它适用于较低的值,但在较高的值上它会导致整数溢出。

[int]$a = Read-Host "First bit of IP address"
[int]$b = Read-Host "2nd bit of IP address"
[int]$c = Read-Host "3rd bit of IP address"
[int]$d = Read-Host "4th bit of IP address"

$a *= 16777216
$b *= 65536
$c *= 256
$base10IP = $a + $b + $c + $d
Write-Host $base10IP

如果输入一些低int的IP地址,例如10.10.10.10(168430090)

,则工作正常

但是有些情况会导致Int溢出。如果[int]达到最大值并给我一个负值,我希望PowerShell能够回滚。

我作为服务台工作,我支持的软件之一需要长版IP,包括负值。

在PowerShell中可行吗?

如果您需要更多详细信息或有些不明确的地方,请告知。

亚历

1 个答案:

答案 0 :(得分:6)

一个简单的解决方案是使用[long]而不是[int]。

[long]$a = Read-Host "First bit of IP address"
[long]$b = Read-Host "2nd bit of IP address"
[long]$c = Read-Host "3rd bit of IP address"
[long]$d = Read-Host "4th bit of IP address"

$a *= 16777216
$b *= 65536
$c *= 256
$base10IP = $a + $b + $c + $d
Write-Host $base10IP

你可以用更少的代码行完成你想要的工作

[IPAddress]$ip = Read-Host "IP address"
$ip.Address

<强>更新

你的评论解释了很长一段时间不是你所追求的。这听起来像你正在寻找的int。

我找不到让PowerShell取消选中(丢失精度)转换或算术的方法,但是使用BitConverter类可以让它工作。

[byte]$a = 10
[byte]$b = 113
[byte]$c = 8
[byte]$d = 203  
[BitConverter]::ToInt32(($a, $b, $c, $d), 0)

[IPAddress]$ip = "10.113.8.203"
$bytes = [BitConverter]::GetBytes($ip.Address)
[BitConverter]::ToInt32($bytes, 0)

请注意,IPAddress也支持IPv6地址,但最后转换为int显然无法保存IPv6地址。