Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Converter de RAW(16) da Oracle para GUID de .NET


Se você observar os valores envolvidos (em pares) de dígitos hexadecimais, poderá ver que os últimos 7 bytes são os mesmos em ambos os casos, mas os primeiros 9 são trocados um pouco.

Partindo do seu exemplo, mas reescrevendo cada par no .NET como 00, 11, 22 etc e trocando o byte relevante do Oracle também temos:

  • .INTERNET:
    00112233445566778899AABBCCDDEEFF
    

  • Oráculo:
    33221100554477668899AABBCCFFEEFF
    

Portanto, deve ser bastante fácil escrever código para alternar entre os bytes relevantes. (Tenho certeza de que escrevi algum código para fazer isso em um trabalho anterior, na verdade.)

Para alternar entre os bytes, basta chamar Guid.ToByteArray() e new Guid(byte[]) para voltar a um Guid .

EDIT:Por acaso, o switch-round acima é exatamente o que o Guid construtor faz quando você passa uma matriz de bytes:
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("-", ""));
    }
}

Impressões:
00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff

Isso pode tornar consideravelmente mais simples realizar a comutação... como você estava conseguindo os valores para começar? É apenas "como eles são exibidos no Oracle"?

EDIT:Ok, aqui estão algumas funções de conversão - se você tiver os dados como texto, eles serão convertidos em cada sentido ...
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;
    }

}