gpt4 book ai didi

powershell - 将字节数组(十六进制)转换为有符号的Int

转载 作者:行者123 更新时间:2023-12-02 23:17:47 27 4
gpt4 key购买 nike

我正在尝试将(可变长度)十六进制字符串转换为带符号整数(我需要正值或负值)。

[Int16] [int 32]和[int64] 似乎可以在2,4+字节长的十六进制字符串上正常工作,但我在使用3个字节的字符串[int24](在powershell中没有这样的命令)。

这是我现在拥有的内容(摘要):

$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)"}

使用上面的代码,$ start值“D35A71”给出的是“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))"

但似乎没有得到正确的结果:-/

最佳答案

要将十六进制数字字符串解析为负数,可以使用[bigint] ( System.Numerics.BigInteger )进行:

# Since the most significant hex digit has a 1 as its most significant bit
# (is >= 0x8), it is parsed as a NEGATIVE number.
# To force unconditional interpretation as a positive number, prepend '0'
# to the input hex string.
PS> [bigint]::Parse('D35A71', 'AllowHexSpecifier')
-2925967

您可以将生成的[bigint]实例强制转换回[int](System.Int32)。

注意:
  • 结果为负数,因为十六进制输入字符串的最高有效十六进制数字是>= 0x8 ,即已将其高位设置。
  • 强制[bigint]无条件解释十六进制。输入字符串作为正数,在0之前添加。
  • 在字节边界上执行结果负数的内部two's complement表示,以便给定的具有奇数个数字的十六进制数字(即,如果第一个十六进制数字是“半字节”)将丢失的半字节填充与1位。
  • 因此,的十六进制数字字符串的最高有效位数是>= 0x8(解析为负数),其结果与在其前面添加一个或多个F s(0xF == 1111)的数字相同;例如,以下所有调用均产生-2048:[bigint]::Parse('800', 'AllowHexSpecifier')[bigint]::Parse('F800', 'AllowHexSpecifier')[bigint]::Parse('FF800', 'AllowHexSpecifier'),...

  • 有关解析逻辑的详细信息,请参见the docs

    示例:
    # First digit (7) is < 8 (high bit NOT set) -> positive number
    [bigint]::Parse('7FF', 'AllowHexSpecifier') # -> 2047

    # First digit (8) is >= 8 (high bit IS SET) -> negative number
    [bigint]::Parse('800', 'AllowHexSpecifier') # -> -2048

    # Prepending additional 'F's to a number that parses as
    # a negative number yields the *same* result
    [bigint]::Parse('F800', 'AllowHexSpecifier') # -> -2048
    [bigint]::Parse('FF800', 'AllowHexSpecifier') # -> -2048
    # ...

    # Starting the hex-number string with '0'
    # *unconditionally* makes the result a *positive* number
    [bigint]::Parse('0800', 'AllowHexSpecifier') # -> 2048

    关于powershell - 将字节数组(十六进制)转换为有符号的Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60300579/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com