【发布时间】:2020-06-03 15:16:01
【问题描述】:
我正在尝试将(可变长度)十六进制字符串转换为有符号整数(我需要正值或负值)。
[Int16] [int 32] 和 [int64] 似乎 可以很好地处理 2,4+ 字节长度的十六进制字符串,但我被 3 字节字符串 [int24] 卡住了( powershell 中没有这样的命令)。
这是我现在拥有的(sn-p):
$start = $mftdatarnbh.Substring($DataRunStringsOffset+$LengthBytes*2+2,$StartBytes*2) -split "(..)"
[array]::reverse($start)
$start = -join $start
if($StartBytes*8 -le 16){$startd =[int16]"0x$($start)"}
elseif($StartBytes*8 -in (17..48)){$startd =[int32]"0x$($start)"}
else{$startd =[int64]"0x$($start)"}
使用上面的代码,“D35A71”的 $start 值会给出“13851249”而不是“-2925967”。我试图找出一种实现二进制补码的方法,但迷路了。有什么简单的方法可以做到这一点吗?
提前谢谢你
编辑:基本上,我想我需要实现这样的东西:int num = (sbyte)array[0] << 16 | array[1] << 8 | array[2];
如here所见。
刚刚试过这个:
$start = "D35A71"
[sbyte]"0x$($start.Substring(0,2))" -shl 16 -bor "0x$($start.Substring(2,2))" -shl 8 -bor "0x$($start.Substring(4,2))"
但似乎没有得到正确的结果:-/
【问题讨论】:
-
你想使用 C# 吗?
-
我不懂 C#,但试图找到一个代码来做同样的事情并转换它。那就是我迷路的地方(在翻译中)..
-
这是干什么用的? 0xD35A71 十进制为 13851249。
-
$MFT FILE 记录 dataruns 看最高位:1101 0011 0101 1010 0111 0001 这是一个负数
-
DWORD 由 32 位而不是 24 位表示。因此,最高有效位实际上是零 (0):
0000 0000 1101 0011 0101 1010 0111 0001
标签: powershell type-conversion hex powershell-4.0