Расчет байтового массива C # с BigInteger не работает должным образом - PullRequest
0 голосов
/ 08 декабря 2018

Итак, мне нужно вычислить байтовые массивы в моей программе, и я заметил странную вещь:

        string aaa = "F8F9FAFBFCFD";
        string aaaah = "10101010101";
        BigInteger dsa = BigInteger.Parse(aaa, NumberStyles.HexNumber) + BigInteger.Parse(aaaah, NumberStyles.HexNumber);
        MessageBox.Show(dsa.ToString("X"));

Когда я добавляю aaa + aaah, он отображает мне 9FAFBFCFDFE, но он должен отображать F9FAFBFCFDFE, но когда явычтите, он делает это правильно, ааа - ааа, отображает F7F8F9FAFBFC, все должно быть правильно в моем коде.

1 Ответ

0 голосов
/ 08 декабря 2018

BigInteger.Parse интерпретирует "F8F9FAFBFCFD" как отрицательное число -7 722 435 347 203 (с использованием дополнения до двух), а не 273 752 541 363 453, как вы, вероятно, ожидаете.

Из документации для BigInteger.Parse:

Если value является шестнадцатеричной строкой, метод Parse(String, NumberStyles) интерпретирует value как отрицательное число, сохраненное с использованием представления дополнения до двух, если его первые две шестнадцатеричные цифры больше или равны 0x80.Другими словами, метод интерпретирует бит старшего разряда первого байта в value как бит знака.

Чтобы получить ожидаемый результат, добавьте префикс aaa с 0 дозаставить его интерпретировать как положительное значение:

string aaa = "0F8F9FAFBFCFD";
string aaaah = "10101010101";
BigInteger dsa = BigInteger.Parse(aaa, NumberStyles.HexNumber)
               + BigInteger.Parse(aaaah, NumberStyles.HexNumber);
MessageBox.Show(dsa.ToString("X")); // outputs 0F9FAFBFCFDFE
...