将byte[]或对象转换为GUID

29

我给一个对象类型赋了一个值,就像这样:

object objData =dc.GetDirectoryEntry().Properties["objectGUID"].Value;
这个对象返回的值是像这样的:{byte[16]} [0]: 145 [1]: 104 [2]: 117 [3]: 139 [4]: 124 [5]: 15 [6]: 255 [7]: 68 [8]: 142 [9]: 159 [10]: 208 [11]: 102 [12]: 148 [13]: 157 [14]: 179 [15]: 75 然后我将这个对象转换成了byte[]类型,如下:
byte[] binaryData = objData as byte[];

此方法会返回以下结果, {byte[16]} [0]: 145 [1]: 104 [2]: 117 [3]: 139 [4]: 124 [5]: 15 [6]: 255 [7]: 68 [8]: 142 [9]: 159 [10]: 208 [11]: 102 [12]: 148 [13]: 157 [14]: 179 [15]: 75

然后我将byte[]中的十六进制值进行转换,如下:

string strHex = BitConverter.ToString(binaryData);
它将返回类似于**91-68-75-8B-7C-0F-FF-44-8E-9F-D0-66-94-9D-B3-4B**的输出。 但我需要像GUID格式一样的输出,我该如何实现?
5个回答

88

你可以使用接受字节数组的 Guid 构造函数,试试看?

Guid guid = new Guid(binaryData);

如果需要将其转换为文本形式,您可以使用Guid.ToString()


谢谢您的回复,它起作用了。有没有办法将GUID从对象数据类型转换? - Manikandan Sethuraju
2
@ManikandanSethuraju:你应该只需进行强制类型转换,例如 new Guid((byte[]) objData) - Jon Skeet
@Rab:我不太确定你在问什么。 - Jon Skeet
2
不幸的是,Guid(byte[]) 生成了一个修改过的 GUID,而不是数组的确切十六进制表示。例如,对于以下字节数组 [27,131,88,183,70,167,69,138,185,73,226,160,62,193,49,52],它生成了 "b758831b-a746-8a45-b949-e2a03ec13134",而应该生成 "1b8358b7-46a7-458a-b949-e2a03ec13134"(27 == 0x1b,131 == 0x83,等等)。但是 Guid(string) 的工作方式不同。如果您传递 "1b8358b746a7458ab949e2a03ec13134",它会直接使用该字符串并生成 "1b8358b7-46a7-458a-b949-e2a03ec13134"。 - evgenybf
@evgenybf:如果需要的话,这只是重新排列字节的问题,这并不是很难做到的。 - Jon Skeet

6
byte[] binaryData = objData as byte[];
string strHex = BitConverter.ToString(binaryData);
Guid id = new Guid(strHex.Replace("-", ""))

2
长格式如下(点击此处查看):
public static string ConvertGuidToOctectString(string objectGuid)
{
    System.Guid guid = new Guid(objectGuid);
    byte[] byteGuid = guid.ToByteArray();
    string queryGuid = "";
    foreach (byte b in byteGuid)
    {
        queryGuid += @"\" + b.ToString("x2");
    }
    return queryGuid;
}

我目前正在使用这个来进行LDAP查询。谢谢。但是难道没有官方的.NET框架方法来获取八位表示法吗? - ovm

0

System.DirectoryServices.DirectoryEntry 类有一个名为 Guid 的属性,用于此目的 - 无需通过 Properties 访问 objectGUID 属性。


0

虽然上面提到的手动转换方法可行,但有一种自动完成此操作的方法。

  1. 您可以使用官方的 SQLite 提供程序而不是 Microsoft 的提供程序。使用其 SQLiteConnectionStringBuilder 配置一个连接,该连接将您的 Guids 识别为 Guids:
var builder = new SQLiteConnectionStringBuilder("Data Source=./mydatabase.db") { BinaryGUID = true };
var connStr = builder.ToString();
return new SQLiteConnection(connStr);

这里是官方的SQLite提供程序:https://www.nuget.org/packages/System.Data.SQLite.Core/

  1. 如果使用Dapper,您可以使用此类自动将字节数组转换为Guid,该类应在应用程序启动时注册一次:
public class GuidTypeHandler : SqlMapper.TypeHandler<Guid>
{
    public override Guid Parse(object value)
    {
        var valueAsBytes = (byte[])value;
        return new Guid(valueAsBytes);
    }

    public override void SetValue(System.Data.IDbDataParameter parameter, Guid value)
    {
        var guidAsBytes = value.ToByteArray();
        parameter.Value = guidAsBytes;
    }
}

// And the registration in Startup.cs or equivalent:
SqlMapper.AddTypeHandler<Guid>(new GuidTypeHandler());

来源:Dapper问题#718 - GitHub


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接