sql >> Databáze >  >> RDS >> Oracle

Převést z RAW (16) Oracle na GUID .NET

Pokud se podíváte na hodnoty (v párech) hexadecimálních číslic, můžete vidět, že posledních 7 bajtů je v obou případech stejných, ale prvních 9 je trochu přehozených.

Vyjdeme-li z vašeho příkladu, ale přepsáním každého páru v .NET jako 00, 11, 22 atd. a přepnutím příslušného bajtu Oracle také dostaneme:

  • .NET:

    00112233445566778899AABBCCDDEEFF
    
  • Oracle:

    33221100554477668899AABBCCFFEEFF
    

Takže by mělo být docela snadné napsat kód pro přepínání příslušných bajtů. (Jsem si docela jistý, že jsem napsal nějaký kód, abych to udělal v předchozí práci.)

Chcete-li zaokrouhlit bajty, stačí zavolat Guid.ToByteArray() a new Guid(byte[]) pro návrat do Guid .

EDIT:Jak se to stalo, přepínač nahoře je přesně co je Guid konstruktor dělá, když mu předáte bajtové pole:

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

Tiskne:

00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff

To může značně zjednodušit provádění přepínání... jak jste se dostali k hodnotám pro začátek? Je to jen „jak se zobrazují v Oracle“?

EDIT:Dobře, zde je několik převodních funkcí – pokud máte data jako text, převedou se každým způsobem...

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. MySQL řekl:Dokumentace #1045 - Přístup odepřen pro uživatele 'root'@'localhost' (pomocí hesla:NE)

  2. Top 50 otázek k pohovoru o SQL Serveru, které si musíte připravit v roce 2022

  3. Jak získám textový obsah z BLOB v Oracle SQL

  4. Jak extrahujete číselnou hodnotu z řetězce v dotazu MySQL?