Преобразование длинной шестнадцатеричной строки в целое число не работает должным образом (работает в SQL) - PullRequest
0 голосов
/ 13 декабря 2011

Мне нужно преобразовать шестнадцатеричную строку в целое число, используя C #. Я перепробовал все предложения по SO, включая , этот и многие другие. Все они выдают одинаковые или примерно одинаковые ... ошибки. Value was either too large or too small for an Int32 (то же самое для Int64).

Я могу получить желаемый результат в SQL Server 2008 с помощью следующего кода:

select convert(int, 0x1B1D3E1B22176145272C1631282D221D30)

Однако ЭТО C # код

Int64.Parse("1B1D3E1B22176145272C1631282D221D30", NumberStyles.HexNumber)
Int32.Parse("1B1D3E1B22176145272C1631282D221D30", NumberStyles.HexNumber)

... выдает ошибки, описанные выше. Мысли ?? Решения?

ОБНОВЛЕНИЕ: Приведенный выше код SQL выдает следующее целое число: 555949360. Для каждой записи, которую я могу найти, преобразование sql дает уникальное целое число. Таким образом, новый вопрос (я полагаю) заключается в том ... как реплицировать результаты функции SQL Convert на эти шестнадцатеричные данные?

Ответы [ 5 ]

1 голос
/ 13 декабря 2011

Хотя SQL Server не выдает ошибку, он не дает правильного ответа. Это урезание шестнадцатеричной строки до нижних 32 битов

select convert(int, 0x2D221D30) = 757210416
select convert(int, 0x1B1D3E1B22176145272C1631282D221D30) = 757210416

Если вы измените это на bigint, вы получите другие результаты:

select convert(bigint, 0x2D221D30) = 757210416
select convert(bigint, 0x1B1D3E1B22176145272C1631282D221D30) = 3176780635782126896
1 голос
/ 13 декабря 2011

Ваш номер слишком велик. Это примерно 9,2264939914744E + 39, когда Int64.MaxValue равно 9,223,372,036,854,775,807.

Попробуйте использовать метод BigInteger.Parse.

0 голосов
/ 13 декабря 2011

Вы (ни SQL Server) можете декодировать 34 байта в 4-байтовое целое число.Шестнадцатеричные строки представляют каждый байт данных в виде двух символов, один для старшего куска (4 бита), один для младшего куска.

Вы можете использовать класс HexEncoding , который я написал для декодирования этогов байтах или напишите свой собственный.

см. также http://en.wikipedia.org/wiki/Hexidecimal

0 голосов
/ 13 декабря 2011

Я попробовал это на вольфраме, это 133-битное число. Вы можете попробовать использовать BigInteger (Byte []) в c #

Это двоичное число, если вы хотите его увидеть: 1101100011101001111100001101100100010000101110110000101000101001001110010110000010110001100010010100000101101001000100001110100110000

0 голосов
/ 13 декабря 2011

Рекомендую посмотреть на BigInteger

http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

BigInteger.Parse("1B1D3E1B22176145272C1631282D221D30", NumberStyles.HexNumber)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...