sql >> Database >  >> RDS >> Oracle

Converteren van Oracle's RAW (16) naar .NET's GUID

Als je kijkt naar de betrokken waarden (in paren) van hexadecimale cijfers, kun je zien dat de laatste 7 bytes in beide gevallen hetzelfde zijn, maar de eerste 9 zijn een beetje omgewisseld.

Als we uitgaan van je voorbeeld, maar elk paar in .NET herschrijven als 00, 11, 22 enz. en ook de relevante byte van Oracle omschakelen, krijgen we:

  • .NET:

    00112233445566778899AABBCCDDEEFF
    
  • Orakel:

    33221100554477668899AABBCCFFEEFF
    

Het zou dus vrij eenvoudig moeten zijn om code te schrijven om de relevante bytes om te wisselen. (Ik ben er vrij zeker van dat ik hiervoor in een vorige baan code heb geschreven.)

Om de bytes om te wisselen, roept u gewoon Guid.ToByteArray() aan. en new Guid(byte[]) om terug te gaan naar een Guid .

EDIT:Toevallig is de bovenstaande omschakeling precies wat de Guid constructor doet wanneer u het een bytearray doorgeeft:

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

Afdrukken:

00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff

Dat maakt het misschien een stuk eenvoudiger om de omschakeling uit te voeren... hoe kwam je in het begin aan de waarden? Is het gewoon "hoe ze worden weergegeven in Oracle"?

EDIT:Oké, hier zijn een paar conversiefuncties - als je de gegevens als tekst hebt, worden ze in elke richting geconverteerd...

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. Is de OraOLEDB-provider in .NET onbetrouwbaar op CLOB-velden?

  2. Oracle krijgt externe sleutels

  3. Selecteer een MySQL-database op Linux via de opdrachtregel

  4. Relationele versus niet-relationele databases - Deel 1