2014-11-11 4 views
3

Я столкнулся с проблемой, когда у меня есть подразумеваемое шестнадцатеричное число без знака в виде строки, предоставленной из пользовательского ввода, которая должна быть преобразована в Biginteger.Каков правильный способ построения Biginteger из подразумеваемой беззнаковой шестнадцатеричной строки в C#?

Благодаря подписанному характеру 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 documentation:

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

+1

В тех случаях, когда входная строка является полностью числовой, однако допускается префикс «0x». Конечно, я могу проверить наличие указанной подстроки, удалить ее и добавить ноль (на самом деле это то, что я делаю в данный момент). Я просто надеюсь на более правильный ответ. – rheone

+0

Обновлен мой ответ. Добавление начального нуля похоже на правильную технику. – SuperOli

+0

Конечно. Отмечено как правильно, и немного разочарован, нет существующего беззнакового большого числа. – rheone