将 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);
}
如果您想要正整数表示,问题中的转换和已接受答案中的反向转换都不适用于所有值。例如,从 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 演示这两种方法。
我可以使用下面的方法将 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);
}
如果您想要正整数表示,问题中的转换和已接受答案中的反向转换都不适用于所有值。例如,从 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 演示这两种方法。