Има ли начин да декларирате 32-битово цяло число без знак в PowerShell?
Опитвам се да добавя неподписано (започва с 0xf
), т.е. 0xff000000 + 0xAA
, но се оказа отрицателно число, докато искам да е 0xff0000AA
.
Има ли начин да декларирате 32-битово цяло число без знак в PowerShell?
Опитвам се да добавя неподписано (започва с 0xf
), т.е. 0xff000000 + 0xAA
, но се оказа отрицателно число, докато искам да е 0xff0000AA
.
0xff00000AA е твърде голям за 32-битово цяло число без знак, използвайте uint64
PS> [uint64]0xff00000AA
68451041450
0xff000000 + 0xAA = 0xff0000AA
, а не 0xff00000AA
. Всички те се вписват в uint32
- person phuclv; 20.04.2020
Кодът от текущо приетия отговор причинява следната грешка в моята система:
Това е така, защото 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"
0xff00000AA
обаче автоматично преобразува в 68451041450
без необходимост от кастинг.
- person SpellingD; 17.05.2012
0xFF0000AA
(четири нули), за да получи Int32
отрицателна стойност със знак (която не успява да се преобразува в стойност без знак), където въпросът използва 0xFF00000AA
(пет нули), за да получи Int64
положителна стойност със знак (което преобразува успешно).
- person Emperor XLII; 15.07.2012
Предполагам, че сте имали предвид 0xff0000AA
, тъй като, както други споменаха, 0xff00000AA
е препълване.
Най-лесният начин да направите това е да конвертирате стойността от низ. Можете да използвате или System.Convert
:
[System.Convert]::ToUInt32('0xff0000AA',16)
[System.Convert]::ToUInt32('ff0000AA',16)
Или просто опитайте да прехвърлите низа, но в този случай трябва да поставите пред 0x
:
[uint32]'0xff0000AA'
Ако, от друга страна, наистина сте искали да знаете 32-битовата неподписана част от 64-битовото число `0xff00000aa', тогава можете да направите следното:
[System.Convert]::ToUInt32([System.Convert]::ToString(0xff00000AA -band ([uint32]::MaxValue),16),16)
Най-простият начин е да прехвърлите към [uint32]
от long
литерал (със суфикс L
). Не е нужно да правите математиката в [uint64]
или да кастирате от низ
[uint32]0xff000000L + 0xAA
В PowerShell 6.2 a серия от нови суфикси са добавени, включително u
суфикс за uint32
, така че това може да се направи още по-просто
0xff000000u + 0xAA