将 GUID 转换为等效数字

Bob*_*Bob 6 vb.net guid .net-4.0 type-conversion

我被要求从 ActiveDirectory 导出用户列表,并将 GUID 转换为等价数字以供显示(因此我将在之后使用 .ToString )。我已经做了一些搜索,但大多数问题都是关于将某些内容转换为 GUID,或者将 GUID 转换为 Int 或一些愚蠢的东西(我知道 Int 太小等等),这并不是真正合适的。

我已经对 AD 内容进行了排序并导出了数据,但是我想知道使用什么数据类型/格式来将 GUID 转换为,以及是否可能。我并不真正关心使用什么确切的数字类型,只要数字仍然是“唯一的”(我知道 GUID 并不是真正唯一的等等)。

GUID 是基于十六进制的格式吗?是否有任何合适的数字类型可以将它们转换为显示?

我正在使用 VB.Net 和 .Net Framework 4。我尝试过使用 BigInteger,但这似乎也会进入负数,如果必须的话我会使用它,但如果有其他更合适的东西我宁愿不使用。

编辑 这是我尝试过的:

使用 GUID:f02c7caf-7e5a-491b-9f23-9476174bdda1

这段代码:

Dim Foo As String = (New System.Numerics.BigInteger(adUserDirectoryRecord.Guid.ToByteArray())).ToString
Run Code Online (Sandbox Code Playgroud)

结果为:-125127638954164478915246035839554388817

注意:一旦完成,我将以 .csv 格式输出,以便另一个团队拾取并导入到另一个系统中,这可能就是他们希望采用数字而不是字母数字格式的原因。

解决方案:

由于无需将数字 GUID 转换回来,因此 BigInteger 是用于此目的的正确方法。更改是调整 ByteArray 的大小以强制其仅为正值:

'Gets the User's GUID from the Active Directory record, converts it to a Byte Array and Resizes it to Force Positive Values Only:
Dim bytGUIDBytes As Byte() = adUserDirectoryRecord.Guid.ToByteArray()
Array.Resize(bytGUIDBytes, 17)

'Converts the User's GUID Bytes into a Numeric Equivalent, and Returns the String version of the Numerical value.
Return New System.Numerics.BigInteger(bytGUIDBytes).ToString
Run Code Online (Sandbox Code Playgroud)

exa*_*ert 3

“数字”在 VB 中没有意义Guid。.net 中没有 128 位数字类型。唯一的 128 位类型是 Decimal;但这似乎没有意义将 a 转换Guid为 a Decimal。我将简单地使用ToByteArray字节值并将其显示为十六进制。

或者,确保赋予 BigInteger 的数组中的最后一个字节为零,以获得正值。例如::

var bytes = Guid.NewGuid().ToByteArray(); 
Array.Resize(ref bytes, 17); 
var bigInt = new BigInteger(bytes);
var value = bigInt.ToString();
Run Code Online (Sandbox Code Playgroud)