9

有没有办法在 PowerShell 中声明一个 32 位无符号整数?

0xf我正在尝试添加一个无符号(以ie开头) 0xff000000 + 0xAA,但结果却是一个负数,而我希望它是0xff0000AA

4

4 回答 4

14

当前接受的答案中的代码导致我的系统出现以下错误:

错误信息

这是因为 PowerShell 总是首先尝试将十六进制值转换为 int,因此即使您转换为uint64,如果数字具有负 int 值,环境也会抱怨。您可以从以下示例中看到这一点:

PS C:\> [uint64] (-1)
Cannot convert value "-1" to type "System.UInt64". Error: "Value was either too large or too small for a UInt64."
At line:1 char:26
+ Invoke-Expression $ENUS; [uint64] (-1)
+                          ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastIConvertible

您需要转换数字的字符串表示形式uint64以避免这种情况:

[uint64]"0xff000000" + [uint64]"0xAA"
于 2012-05-16T20:41:37.980 回答
8

0xff00000AA 对于 32 位无符号整数来说太大,使用 uint64

PS> [uint64]0xff00000AA
68451041450
于 2012-05-16T20:26:12.897 回答
1

最简单的方法是[uint32]long文字(带有L后缀)转换为。您无需在[uint64]字符串中进行数学运算或转换

[uint32]0xff000000L + 0xAA

在 PowerShell 6.2中添加了一系列新后缀,包括u后缀 fof uint32,因此可以更简单地完成

0xff000000u + 0xAA
于 2020-04-20T02:58:57.273 回答
0

我假设您的意思是0xff0000AA,正如其他人提到的那样,0xff00000AA是溢出。

最简单的方法是从字符串转换值。您可以使用System.Convert

[System.Convert]::ToUInt32('0xff0000AA',16)
[System.Convert]::ToUInt32('ff0000AA',16)

或者只是尝试转换字符串,但在这种情况下,您需要在前面添加0x

[uint32]'0xff0000AA'

另一方面,如果您确实知道 64 位数字“0xff00000aa”的 32 位无符号整数部分,那么您可以这样做:

[System.Convert]::ToUInt32([System.Convert]::ToString(0xff00000AA -band ([uint32]::MaxValue),16),16)
于 2016-02-22T02:11:39.850 回答