Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Konvertieren Sie von Oracles RAW(16) in die GUID von .NET

Wenn Sie sich die beteiligten Werte (paarweise) von Hex-Ziffern ansehen, sehen Sie, dass die letzten 7 Bytes in beiden Fällen gleich sind, aber die ersten 9 etwas vertauscht sind.

Wenn wir von Ihrem Beispiel ausgehen, aber jedes Paar in .NET als 00, 11, 22 usw. umschreiben und auch das relevante Byte von Oracle wechseln, erhalten wir:

  • .NET:

    00112233445566778899AABBCCDDEEFF
    
  • Orakel:

    33221100554477668899AABBCCFFEEFF
    

Es sollte also ziemlich einfach sein, Code zu schreiben, um die relevanten Bytes umzuschalten. (Ich bin mir ziemlich sicher, dass ich in einem früheren Job Code dafür geschrieben habe.)

Um die Bytes umzuschalten, rufen Sie einfach Guid.ToByteArray() auf und new Guid(byte[]) um zu einer Guid zurückzukehren .

BEARBEITEN:Zufällig ist die obige Umschaltung genau was die Guid Konstruktor tut, wenn Sie ihm ein Byte-Array übergeben:

using System;
using System.Linq;

class Test
{
    static void Main()
    {
        byte[] bytes = Enumerable.Range(0, 16)
                                 .Select(x => x * 16 + x)
                                 .Select(x => (byte) x)
                                 .ToArray();

        Console.WriteLine(BitConverter.ToString(bytes).Replace("-", ""));
        Console.WriteLine(new Guid(bytes).ToString().Replace("-", ""));
    }
}

Drucke:

00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff

Das macht es vielleicht wesentlich einfacher, die Umschaltung durchzuführen ... wie sind Sie zu Beginn an die Werte gekommen? Ist es nur "wie sie in Oracle angezeigt werden"?

BEARBEITEN:Okay, hier sind ein paar Konvertierungsfunktionen - wenn Sie die Daten als Text haben, werden sie in beide Richtungen konvertiert ...

using System;
using System.Linq;

class Test
{
    static void Main()
    {
        string oracle = "329DD817216CD6429B989F5201288DBF";
        string dotNet = "17D89D326C2142D69B989F5201288DBF";

        Console.WriteLine(oracle == DotNetToOracle(dotNet));
        Console.WriteLine(dotNet == OracleToDotNet(oracle));
    }

    static string OracleToDotNet(string text)
    {
        byte[] bytes = ParseHex(text);
        Guid guid = new Guid(bytes);
        return guid.ToString("N").ToUpperInvariant();
    }

    static string DotNetToOracle(string text)
    {
        Guid guid = new Guid(text);
        return BitConverter.ToString(guid.ToByteArray()).Replace("-", "");
    }

    static byte[] ParseHex(string text)
    {
        // Not the most efficient code in the world, but
        // it works...
        byte[] ret = new byte[text.Length / 2];
        for (int i = 0; i < ret.Length; i++)
        {
            ret[i] = Convert.ToByte(text.Substring(i * 2, 2), 16);
        }
        return ret;
    }

}