将 Guid 字符串转换为 BigInteger,反之亦然

Convert a Guid string into BigInteger and vice versa

我可以使用下面的方法将 Guid 字符串转换为 BigInteger。如何将 BigInteger 转换回 Guid 字符串。

using System;
using System.Numerics;

class Class1
{       
    public static BigInteger GuidStringToBigInt(string guidString)
    {
        Guid g = new Guid(guidString);
        BigInteger bigInt = new BigInteger(g.ToByteArray());
        return bigInt;
    }

    static void Main(string[] args)
    {
        string guid1 = "{90f0fb85-0f80-4466-9b8c-2025949e2079}";

        Console.WriteLine(guid1);
        Console.WriteLine(GuidStringToBigInt(guid1));
        Console.ReadKey();
    }
}

请检查:

public static Guid ToGuid(BigInteger value)
{
     byte[] bytes = new byte[16];
     value.ToByteArray().CopyTo(bytes, 0);
     return new Guid(bytes);
}

编辑:Working Fiddle

如果您想要正整数表示,问题中的转换和已接受答案中的反向转换都不适用于所有值。例如,从 ffffffff-ffff-ffff-ffff-ffffffffffff 转换为 BigInteger 将得到 -1。从 340282366920938463463374607431768211455 转换为 Guid 会出现异常。

如果您确实需要正数表示(例如,如果您尝试转换基数则很有用),则需要在字节数组的末尾添加一个值为零的额外字节。 (看这个 illustration for a positive values 就在第一个“备注”部分之前)。

public static BigInteger GuidStringToBigIntPositive(string guidString)
{
    Guid g = new Guid(guidString);
    var guidBytes = g.ToByteArray();
    // Pad extra 0x00 byte so value is handled as positive integer
    var positiveGuidBytes = new byte[guidBytes.Length + 1];
    Array.Copy(guidBytes, positiveGuidBytes, guidBytes.Length);

    BigInteger bigInt = new BigInteger(positiveGuidBytes);
    return bigInt;
}

public static string BigIntToGuidStringPositive(BigInteger bigint)
{
    // Allocate extra byte to store the large positive integer
    byte[] positiveBytes = new byte[17];
    bigint.ToByteArray().CopyTo(positiveBytes, 0);
    // Strip the extra byte so Guid can handle it
    byte[] bytes = new byte[16];
    Array.Copy(positiveBytes, bytes, bytes.Length);
    return new Guid(bytes).ToString();
}

Fiddle 演示这两种方法。