【问题标题】:Powershell bigint output differ from declared valuePowershell bigint 输出与声明值不同
【发布时间】:2019-08-17 09:07:34
【问题描述】:

我正在将 lesspass 密码管理器移植到 powershell,但在实现 _consume_entropy() method 时遇到了问题,尤其是 Python divmod

再现

PS> [bigint]$EntropyAsInt = 99600400399777174105034830393873797761817714609490038944205586760025858632478
PS> Write-Host $EntropyAsInt
99600400399777173995117538344184441997741701018199539534149245151907290284032

区别

99600400399777174105034830393873797761817714609490038944205586760025858632478
99600400399777173995117538344184441997741701018199539534149245151907290284032
                ^ start diverging he

问题

这是怎么回事?我是不是用错了类型?

【问题讨论】:

    标签: powershell .net-core biginteger powershell-v6.0


    【解决方案1】:

    我可以复制这种行为,但无法解释它。我可以做的是为您提供解决方法。将变量定义为[bigint],然后将您的数字解析为引用先前创建的变量的字符串。

    [bigint]$EntropyAsInt=0
    [bigint]::TryParse('99600400399777174105034830393873797761817714609490038944205586760025858632478',[ref]$EntropyAsInt)
    

    然后您可以验证$EntropyAsInt 是否包含您之前指定的号码。

    【讨论】:

    • 看到我在 slack 上得到的答案
    【解决方案2】:

    感谢 Powershell slack 上的 ?Joel?:

    问题是 bigint 转换在解析值之后才会生效。它将首先被解析为双精度,其中出现不精确的地方

    如果您希望它保留确切的数字,则需要将文字放在引号中以使其成为字符串并让强制转换本身进行解析

    [bigint]$var = "12345342827266162738883736363"
    

    好好工作

    [bigint]$EntropyAsInt = "99600400399777174105034830393873797761817714609490038944205586760025858632478"
    

    【讨论】:

      【解决方案3】:

      99600400399777174105034830393873797761817714609490038944205586760025858632478[Double]...

      PS> 99600400399777174105034830393873797761817714609490038944205586760025858632478
      9.96004003997772E+76
      PS> (99600400399777174105034830393873797761817714609490038944205586760025858632478).ToString("F0")
      99600400399777200000000000000000000000000000000000000000000000000000000000000
      PS> (99600400399777174105034830393873797761817714609490038944205586760025858632478).GetType()
      
      IsPublic IsSerial Name                                     BaseType
      -------- -------- ----                                     --------
      True     True     Double                                   System.ValueType
      

      当它被转换为[BigInt] 时,原始值已经丢失。以[String] 开头会保留它,但...

      PS> [bigint]$EntropyAsInt = '99600400399777174105034830393873797761817714609490038944205586760025858632478'
      PS> $EntropyAsInt
      99600400399777174105034830393873797761817714609490038944205586760025858632478
      

      更多信息请参见Instantiating a BigInteger Object

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 2019-05-01
        • 2022-06-23
        • 2018-06-28
        相关资源
        最近更新 更多