通过按位运算将大整数转换为有意义的值

时间:2012-07-10 16:41:25

标签: powershell integer bit-manipulation

我在PowerShell中进行OS调用以获取特定进程的工作集。

当工作集是< 2GB,正确返回值。

当工作集介于2GB和4GB之间时,该值将返回为负数。我可以用4294967295 xor它,乘以-1,得到正确的值。

世界上一切都很好......直到工作组超过4GB。现在返回的值似乎从4GB开始...... IOW,我需要将结果添加到4294967296。

我的按位操作斩波有点生疏,我不确定是否有办法根据操作系统返回的内容准确计算出正确的值。理想情况下,我希望有一个表达式可以完成这项工作,或者至少有一系列“if”语句。

以下是PS代码,以便澄清情况。它只准确地计算值的工作集< 4GB。

$ServerName = "MyServer"

# get a collection containing all process objects on the system
$Procs = (Get-Process -ComputerName $ServerName) | Sort-Object -Descending WS

# Output each process and its working set
foreach($Proc in $Procs)
{
     $WorkingSet = [int64]($Proc.WorkingSet64)

     #for values greater than 2^32, a negative value will be returned... need to convert to 64 bit:
     if($WorkingSet -lt 0) {
        $WorkingSet = 4294967295 -bxor $WorkingSet * -1
     }

     $Process = $Proc.ProcessName

     Write-Host "Process:     $process"
     Write-Host "Working Set: $WorkingSet"
     Write-Host "------------------------------"
}

2 个答案:

答案 0 :(得分:1)

这是bug in the .NET Framework。它只抓取结果的底部32位并将其转换为64位数字。

问题是,一旦顶部位被截断,您没有足够的信息来确定实际值。你有任何价值可以确定的范围吗?例如,如果您知道它介于2 GB和6 GB之间,则可以很容易地映射该方法返回的值。

我能想到的唯一通用解决方案是查看其他可用属性,看看是否有任何属性可以给你足够的提示来确定返回值的范围。

答案 1 :(得分:1)

使用WorkingSet64而不是WS

例如:

Get-Process -Name notepad | Select-Object -ExpandProperty WorkingSet64

/安德烈