Выходные данные Powershell bigint отличаются от заявленных значений - PullRequest
0 голосов
/ 27 марта 2019

Я портирую менеджер паролей lesspass на powershell, но у меня возникают проблемы при реализации метода _consume_entropy () , особенно Python divmod.

Воспроизведение

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

Разница

99600400399777174105034830393873797761817714609490038944205586760025858632478
99600400399777173995117538344184441997741701018199539534149245151907290284032
                ^ start diverging he

Вопрос

В чем здесь дело?Я использую неправильный тип?

Ответы [ 3 ]

1 голос
/ 27 марта 2019

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

См. Создание объекта BigInteger для получения дополнительной информации.

0 голосов
/ 27 марта 2019

Благодаря ?Joel Pow на слабом Powershell:

Проблема в том, что приведение в действие bigint не вступает в силу до тех пор, пока значение не будет проанализировано.Сначала он будет обработан как double, что в случае неточности

Если вы хотите, чтобы оно сохранило точное число, вам нужно поместить ваш литерал в кавычки, чтобы сделать его строкой, и чтобы сам приведение произвелоразбор

[bigint]$var = "12345342827266162738883736363"

отлично работает

[bigint]$EntropyAsInt = "99600400399777174105034830393873797761817714609490038944205586760025858632478"
0 голосов
/ 27 марта 2019

Я могу повторить поведение, но не могу объяснить это. То, что я могу сделать, это предложить вам обходной путь. Определите переменную как [bigint], а затем проанализируйте ваш номер как строку, ссылающуюся на ранее созданную переменную.

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

Затем вы можете проверить, что $EntropyAsInt содержит номер, который вы указали ранее.

...