Шестнадцатеричная строка для числа в C#? - PullRequest
1 голос
/ 19 марта 2020

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

Я пытался, как показано ниже, но это дает отрицательное значение:

var dec1 = long.Parse("F0A6AFE69D2271E7", System.Globalization.NumberStyles.HexNumber);
// Result: dec1 = -1106003253459258905

В то время как в Javascript он работает нормально, как ниже:

var dec2 = parseInt("F0A6AFE69D2271E7", 16);
// Result: dec2 = 17340740820250292000 

Ответы [ 2 ]

8 голосов
/ 19 марта 2020

Число, которое вы анализируете, находится вне диапазона long - long.MaxValue равно 0x7FFFFFFFFFFFFFFF, а ваше значение равно 0xF0A6AFE69D2271E7.

Вместо этого используйте ulong.Parse, и оно должно быть в порядке.

Я подозреваю, что это "работает" в JavaScript, потому что (на момент написания) все JavaScript числа являются 64-битными значениями с плавающей запятой, поэтому имеют огромный диапазон - но с меньшей точностью, поэтому значение, которое явно странно (последний гекс ди git 7) дает четный результат.

3 голосов
/ 19 марта 2020

См. https://en.wikipedia.org/wiki/Two%27s_complement, чтобы понять, почему ваш номер был интерпретирован как отрицательное число. Говоря точнее, это не проблема «вне диапазона», а просто ваше шестнадцатеричное представление дает точное отрицательное число. Тип "long" является целым числом со знаком и не может содержать полных 64-битных положительных чисел, поскольку его MSB сохраняется для представления отрицательных чисел. Попробуйте вместо этого использовать "ulong".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...