Преобразовать GUID в строку в десятичной основе (иначе говоря, в огромное целое число, разделенное запятыми, в десятичной) - PullRequest
3 голосов
/ 17 ноября 2010

Как я могу преобразовать System.GUID (в C #) в строку в десятичном формате (или в большое целое число, разделенное запятыми, в десятичном числе)?

Что-то вроде 433,352,133,455,122,445,557,129, ...

Guid.ToString преобразует GUID в шестнадцатеричные представления.

Я использую C # и .Net 2.0.

Ответы [ 4 ]

9 голосов
/ 05 января 2013

Обратите внимание, что guid.ToByteAray () НЕ вернет массив, который может быть передан в BigInteger. Для использования массива требуется переупорядочение и конечный ноль, чтобы Biginteger рассматривал byteArray как положительное число (см. Документы MSDN). Простая, но менее эффективная функция:

private static string GuidToStringUsingStringAndParse(Guid value)
        {
            var guidBytes = string.Format("0{0:N}", value);
            var bigInteger = BigInteger.Parse(guidBytes, NumberStyles.HexNumber);
            return bigInteger.ToString("N0", CultureInfo.InvariantCulture);
        }
2 голосов
/ 09 апреля 2015

Как отметил Виктор Деркс в своем ответе, вы должны добавить байт 00 в конец массива, чтобы убедиться, что полученный BigInteger положителен.

Согласно документации MSDN структуры BigInteger (System.Numerics):

Чтобы конструктор BigInteger (Byte []) не перепутал представление дополнения двух отрицательных значений с представлением знака и величины положительного значения, положительных значений, в котором старший бит последнего байта в массиве байтов обычно устанавливается, должен включать дополнительный байт со значением 0.

(см. Также: байт [] для беззнакового BigInteger? )

Вот код для этого:

var guid = Guid.NewGuid();
return String.Format("{0:N0}",
    new BigInteger(guid.ToByteArray().Concat(new byte[] { 0 }).ToArray()));
1 голос
/ 28 апреля 2011

Для краткости вы можете выполнить ту же работу с помощью одной строки кода:

string GuidToInteger = (new BigInteger(Guid.NewGuid().ToByteArray())).ToString("N0");

Имейте в виду, что .ToString("N0") не "НЕТ" ... видите разницу?

Наслаждайтесь

1 голос
/ 17 ноября 2010
using System;
using System.Numerics;

Guid guid = Guid.NewGuid();
byte[] guidAsBytes = guid.ToByteArray();
BigInteger guidAsInt = new BigInteger(guidAsBytes);
string guidAsString = guidAsInt.ToString("N0");

Обратите внимание, что порядок байтов в байтовом массиве отражает порядковый номер субкомпонентов GUID.

...