sql >> Databasteknik >  >> RDS >> Oracle

Konvertera från Oracles RAW(16) till .NET:s GUID

Om du tittar på de inblandade värdena (i par) av hexadecimala siffror kan du se att de sista 7 byten är desamma i båda fallen, men de första 9 är växlade lite.

Om vi ​​går från ditt exempel, men skriver om varje par i .NET som 00, 11, 22 etc och byter även den relevanta byten för Oracle får vi:

  • .NET:

    00112233445566778899AABBCCDDEEFF
    
  • Oracle:

    33221100554477668899AABBCCFFEEFF
    

Så det borde vara ganska enkelt att skriva kod för att växla runt de relevanta byten. (Jag är ganska säker på att jag skrev någon kod för att göra detta i ett tidigare jobb, faktiskt.)

För att växla runt byte, vill du bara ringa Guid.ToByteArray() och new Guid(byte[]) för att gå tillbaka till en Guid .

EDIT:Som det händer, är omställningen ovan exakt vad är Guid konstruktorn gör när du skickar den en byte-array:

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("-", ""));
    }
}

Utskrifter:

00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff

Det kan mycket väl göra det betydligt enklare att utföra växlingen... hur fick du tag i värdena till att börja med? Är det bara "hur de visas i Oracle"?

EDIT:Okej, här är ett par konverteringsfunktioner - om du har data som text kommer de att konvertera åt olika håll...

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;
    }

}


  1. Hur man genererar automatiskt inkrementfält i den valda frågan

  2. Kontrollera om en postgresql-tabell finns under python (och förmodligen Psycopg2)

  3. PostgreSQL-anonymisering på begäran

  4. Ta bort dubbletter av rader i en tabell