Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Konversi dari Oracle's RAW(16) ke .NET's GUID

Jika Anda melihat nilai yang terlibat (berpasangan) dari digit heksadesimal, Anda dapat melihat bahwa 7 byte terakhir sama dalam kedua kasus, tetapi 9 byte pertama sedikit berubah.

Pergi dari contoh Anda, tetapi menulis ulang setiap pasangan di .NET sebagai 00, 11, 22 dll dan mengganti byte Oracle yang relevan juga, kami mendapatkan:

  • .NET:

    00112233445566778899AABBCCDDEEFF
    
  • Oracle:

    33221100554477668899AABBCCFFEEFF
    

Jadi seharusnya cukup mudah untuk menulis kode untuk mengganti byte yang relevan. (Saya cukup yakin saya menulis beberapa kode untuk melakukan ini di pekerjaan sebelumnya, sebenarnya.)

Untuk beralih di sekitar byte, Anda hanya perlu memanggil Guid.ToByteArray() dan new Guid(byte[]) untuk kembali ke Guid .

EDIT:Seperti yang terjadi, putaran sakelar di atas tepat apa Guid konstruktor lakukan ketika Anda meneruskannya array byte:

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

Cetakan:

00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff

Itu mungkin membuatnya jauh lebih mudah untuk melakukan peralihan ... bagaimana Anda mendapatkan nilai untuk memulai? Apakah hanya "bagaimana mereka ditampilkan di Oracle"?

EDIT:Oke, berikut adalah beberapa fungsi konversi - jika Anda memiliki data sebagai teks, mereka akan mengonversi setiap arah...

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. Cara menjalankan file skrip .SQL menggunakan c#

  2. Apa jejak klien minimum yang diperlukan untuk menghubungkan C# ke database Oracle?

  3. Fungsi Bernilai Tabel di ORACLE 11g? ( tampilan parameter )

  4. Data Kueri dari XML

  5. Bagaimana cara melewatkan parameter boolean ke prosedur Oracle C #