Как правильно построить Biginteger из неявной шестнадцатеричной строки без знака в C#?

Я сталкиваюсь с проблемой, когда в качестве строки, полученной из пользовательского ввода, подразумевается шестнадцатеричное число без знака, которое необходимо преобразовать в Biginteger.

Благодаря подписанному типу Biginteger любой вход, в котором установлен бит самого высокого порядка (0x8 / 1000b), результирующее число обрабатывается как отрицательное. Эта проблема, однако, не может быть решена путем простой проверки знакового бита и умножения на -1 или получения абсолютного значения из-за его дополнения, которое не будет учитывать основную запись, например, обрабатывая все значения 0xF* как -1.

Ниже приведен пример ввода / вывода

var style = NumberStyles.HexNumber | NumberStyles.AllowHexSpecifier;


BigInteger.TryParse("6", style) == 6   // 0110 bin
BigInteger.TryParse("8", style) == -8  // 1000 bin
BigInteger.TryParse("9", style) == -7  // 1001 bin
BigInteger.TryParse("A", style) == -6  // 1010 bin
...
BigInteger.TryParse("F", style) == -1  // 1111 bin
...
BigInteger.TryParse("FA", style) == -6 // 1111 1010 bin
BigInteger.TryParse("FF", style) == -1 // 1111 1111 bin
...
BigInteger.TryParse("FFFF", style) == -1 // 1111 1111 1111 1111 bin

Как правильно построить Biginteger из подразумеваемой шестнадцатеричной строки без знака?

1 ответ

Решение

Префикс вашей шестнадцатеричной строки с "0" должен сделать это:

BigInteger.TryParse(string.Format("0{0}", "FFFF"), style, ...)

Мой BigInteger 65535 в приведенном выше примере.

редактировать

Выдержка из документации BigInteger:

При синтаксическом анализе шестнадцатеричной строки методы BigInteger.Parse(String, NumberStyles) и BigInteger.Parse(String, NumberStyles, IFormatProvider) предполагают, что если задан старший значащий бит первого байта в строке, или если первый шестнадцатеричный символ строки представляет младшие четыре бита байтового значения, значение представлено с использованием представления дополнения до двух. Например, "FF01" и "F01" представляют десятичное значение -255. Чтобы отличить положительные значения от отрицательных, положительные значения должны включать ведущий ноль. Соответствующие перегрузки метода ToString, когда им передается строка формата "X", добавляют положительный ноль к возвращаемой шестнадцатеричной строке для положительных значений.

Другие вопросы по тегам