6

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

我已经对 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

结果是:-125127638954164478915246035839554388817

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

解决方案:

由于无需将 Numeric 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
4

2 回答 2

1

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

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

var bytes = Guid.NewGuid().ToByteArray(); 
Array.Resize(ref bytes, 17); 
var bigInt = new BigInteger(bytes);
var value = bigInt.ToString();
于 2012-08-07T15:51:20.033 回答
0

您可以使用 ToString("n") 简单地将 Guid 转换为数字表示:

Guid.NewGuid().ToString("n")

将返回类似“5ee575bd995b419499aff6d6967c4a35”的内容

于 2018-04-18T09:14:33.433 回答