Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将GUID转换为等效的数字_Vb.net_.net 4.0_Type Conversion_Guid - Fatal编程技术网

Vb.net 将GUID转换为等效的数字

Vb.net 将GUID转换为等效的数字,vb.net,.net-4.0,type-conversion,guid,Vb.net,.net 4.0,Type Conversion,Guid,我被要求从ActiveDirectory导出一个用户列表,并将guid转换为一个数字等价物以供显示(因此我将在后面使用.ToString)。我已经做了一些搜索,但大多数问题都是关于将某个东西转换为GUID,或者将GUID转换为Int或其他愚蠢的东西(我知道Int太小等等),这些都不太合适 我已经对广告内容进行了分类,并导出了数据,但是我想知道要使用什么数据类型/格式来转换guid,以及是否可能。只要数字仍然是“唯一的”(我知道guid并不是唯一的等等),我就不在乎使用的是什么确切的数字类型 gu

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

我已经对广告内容进行了分类,并导出了数据,但是我想知道要使用什么数据类型/格式来转换guid,以及是否可能。只要数字仍然是“唯一的”(我知道guid并不是唯一的等等),我就不在乎使用的是什么确切的数字类型

guid是基于十六进制的格式,有没有合适的数字类型可以转换为显示

我正在使用VB.Net和.NETFramework4。我尝试过使用BigInteger,但它似乎也变成了负数,如果有必要,我会使用它,但如果有其他更合适的方法,我宁愿不使用

编辑 以下是我尝试过的:

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

该代码:

结果是: -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
“Numeric”在VB w.r.t
Guid
中没有意义。net中没有128位数字类型。唯一的128位类型是十进制;但将
Guid
转换为
Decimal
似乎没有意义。我只需使用
ToByteArray
并将字节值显示为十六进制

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

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

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


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

如果您认为GUID不是真正唯一的,为什么转换为数字表示会改变这一点?您需要128位无符号整数数据类型。例如,请看这个问题:我不想更改“唯一性”,我被要求将其转换为等效数字的原因是它将是一种更适合显示/输入到另一个系统的格式。我只提到了关于它们是“唯一”的部分,以表明这不是一个要求,因为我理解它们不是(因为它们只是一个大的128位值,有一个很小的冲突机会)。
biginger
看起来是您唯一真正的选择。不确定你从哪里得到了负的想法——这完全取决于你如何表示GUID。编辑了我尝试用于BigInteger的代码,以及它是如何产生的。让我知道我是否是一个彻头彻尾的笨蛋。我现在也来看看128位无符号的。顺便说一句,只有一些值是负数,这一个:“1c30c658-7da4-4d04-be57-cc8412c91868”的结果是:“138368404917772402407527972134244632152”嗯,我用了大整数转换(在顶部编辑我的帖子以显示我使用的内容)。我相信他们会要求我将其转换为数字,因为他们会将其导入另一个系统中,该系统不允许该字段使用字母数字,所以裸骨十六进制可能不合适。那么,这个要求完全是疯了吗?基于GUID的结构。我不相信他们想把它转换回来,只把它作为一个数值(而不是GUID)存储在他们导入到的任何字段中。我会与他们核实,它将支持一个数字,虽然如此之久!否则,他们可能必须使用不同的字段。我检查的是,您可以将GUID转换为等效的数字(而不会丢失数据),以及最适合的类型。我使用了BigInt,但正如我在第一篇文章中编辑的那样,对于一些ID,它将它们转换为负值:汉克斯,我已经和团队核实过了,他们要导入的字段将采用该大小。我刚刚试过这样的方法:
Dim GUIDBytes As Byte()=adUserDirectoryRecord.Guid.ToByteArray()数组。Resize(bytGUIDBytes,17)Dim Blah As String=New System.Numerics.BigInteger(bytGUIDBytes)。ToString
得到了:“21515447279666773984548128571592213822639”,之前是:“-1251276389541644789152460359554388817”。这仍然正确吗?它至少给出了所有的正值,这很好。由于它不会被转换回任何方式只要“独特性”仍然保留,这一切都很好顺便说一句。谢谢!我已将解决方案编辑到我的初始帖子中。工作完成了。为帮助干杯!:)那是字母数字。不,那是十六进制,当然是数字哈。有趣。如果希望结果为十进制:
Convert.ToInt64(Guid.NewGuid().ToString(“n”),16)
var bytes = Guid.NewGuid().ToByteArray(); 
Array.Resize(ref bytes, 17); 
var bigInt = new BigInteger(bytes);
var value = bigInt.ToString();
Guid.NewGuid().ToString("n")