Сдвиг 128-разрядного подписанного BigInteger, чтобы всегда быть положительным - PullRequest
0 голосов
/ 26 мая 2011

Я конвертирую Guid в BigInteger, чтобы я мог base62 его кодировать. Это хорошо работает, однако я могу получить отрицательные числа в BigInterger. Как мне сдвинуть BigInteger, чтобы число было положительным. Я также должен быть в состоянии переместить его обратно, чтобы я мог преобразовать обратно в Guid.

// GUID is a 128-bit signed integer 
Guid original = new Guid("{35db5c21-2d98-4456-88a0-af263ed87bc2}");
BigInteger b = new BigInteger(original.ToByteArray());

// shift so its a postive number?

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Примечание. Для безопасной версии URL-адреса Base64 рассмотрите возможность использования измененного набора символов для Base64 (http://en.wikipedia.org/wiki/Base64#URL_applications) вместо пользовательского Base62.

Я полагаю, что вы можете сначала добавить 0 к массиву (старший байт всегда будет содержать не 1 в старшем бите), а затем преобразовать в BigInteger, если вам действительно нужен положительный BigInteger.

0 голосов
/ 26 мая 2011

Если вы иногда получаете отрицательные числа, это означает, что значение GUID достаточно велико, чтобы заполнить все 128 битов BigInteger, иначе байт BigInteger [] интерпретирует данные как таковые.Чтобы убедиться, что ваши байты действительно положительные, убедитесь, что вы получаете <= 16 байтов (128 бит) и что самый старший бит последнего байта (потому что он имеет младший порядок) равен нулю.Если у вас <16 байтов, вы можете просто <a href="https://stackoverflow.com/questions/5649190/byte-to-unsigned-biginteger/5649264#5649264"> добавить нулевой байт к вашему массиву (опять же, добавить, потому что он имеет младший порядок), чтобы убедиться, что ядро ​​BigInteger рассматривает его как положительное число.

0 голосов
/ 26 мая 2011

Вы имеете в виду base64 encode?

Convert.ToBase64String(Guid.NewGuid().ToByteArray());
...