Как правильно построить 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", добавляют положительный ноль к возвращаемой шестнадцатеричной строке для положительных значений.