Oracle
 sql >> база данни >  >> RDS >> Oracle

Преобразувайте от RAW(16) на Oracle в GUID на .NET

Ако погледнете включените стойности (по двойки) шестнадесетични цифри, можете да видите, че последните 7 байта са еднакви и в двата случая, но първите 9 се превключват малко.

Изхождайки от вашия пример, но пренаписвайки всяка двойка в .NET като 00, 11, 22 и т.н. и превключвайки съответния байт на Oracle, получаваме:

  • .NET:

    00112233445566778899AABBCCDDEEFF
    
  • Оракул:

    33221100554477668899AABBCCFFEEFF
    

Така че би трябвало да е сравнително лесно да се напише код за превключване на съответните байтове. (Всъщност съм сигурен, че написах някакъв код, за да направя това в предишна работа.)

За да превключвате между байтовете, просто ще искате да извикате Guid.ToByteArray() и new Guid(byte[]) за да се върнете към Guid .

РЕДАКТИРАНЕ:Както се случва, превключването по-горе е точно какво е Guid конструкторът прави, когато му предадете масив от байтове:

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

Отпечатъци:

00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff

Това може да направи значително по-лесно извършването на превключването... как успяхте да се сдобиете със стойностите за начало? Просто "как се показват в Oracle"?

РЕДАКТИРАНЕ:Добре, ето няколко функции за преобразуване - ако имате данните като текст, те ще конвертират във всяка посока...

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Database 20c Нови функции

  2. Видео:Производителност на колона Oracle 12c IDENTITY на RAC

  3. Събития за изчакване на Oracle, които всеки трябва да знае

  4. Как да определите размера на таблиците в Oracle

  5. Как да показвате коментари на колона с операция desc