web-dev-qa-db-ja.com

byte []またはオブジェクトをGUIDに変換します

次のようなオブジェクトデータタイプに値を割り当てました。

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のように返されます

次に、16進値をbyte []のように変換します、

string strHex = BitConverter.ToString(binaryData);

それは**91-68-75-8B-7C-0F-FF-44-8E-9F-D0-66-94-9D-B3-4B**のように返されます。しかし、GUID形式のような出力が必要です。どうすればこれを達成できますか?

20

バイト配列を取る Guidコンストラクタ を使用するのはどうですか?

_Guid guid = new Guid(binaryData);
_

(必要に応じて、Guid.ToString()を使用してテキスト形式で取得できます。)

50
Jon Skeet
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;
}
2
Michael Flyger

上記の手動キャストは機能しますが、これを自動的に行う方法があります。

  1. Microsoftのプロバイダーではなく、公式のSQLiteプロバイダーを使用できます。 SQLiteConnectionStringBuilderを使用して、GuidをGuidとして認識する接続を構成します。
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 Issue#718-GitHub

0

System.DirectoryServices.DirectoryEntryクラスには、この目的のためにGuidプロパティがあります。Propertiesを介してobjectGUID属性にアクセスする必要はありません。

0
dahvyd