Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chuyển đổi từ RAW của Oracle (16) sang GUID của .NET

Nếu bạn nhìn vào các giá trị liên quan (theo cặp) của chữ số hex, bạn có thể thấy rằng 7 byte cuối cùng giống nhau trong cả hai trường hợp, nhưng 9 byte đầu tiên được chuyển đổi một chút.

Đi từ ví dụ của bạn, nhưng viết lại từng cặp trong .NET dưới dạng 00, 11, 22, v.v. và chuyển đổi byte liên quan của Oracle, chúng tôi nhận được:

  • .NET:

    00112233445566778899AABBCCDDEEFF
    
  • Oracle:

    33221100554477668899AABBCCFFEEFF
    

Vì vậy, sẽ khá dễ dàng để viết mã để chuyển đổi các byte có liên quan. (Trên thực tế, tôi khá chắc chắn rằng mình đã viết một số mã để thực hiện việc này trong một công việc trước đây.)

Để chuyển đổi các byte, bạn chỉ cần gọi Guid.ToByteArray()new Guid(byte[]) để quay lại Guid .

CHỈNH SỬA:Khi nó xảy ra, vòng chuyển đổi ở trên là chính xác Guid là gì hàm tạo thực hiện khi bạn truyền cho nó một mảng 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("-", ""));
    }
}

Bản in:

00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff

Điều đó cũng có thể làm cho việc thực hiện chuyển đổi trở nên đơn giản hơn đáng kể ... bạn đã nắm bắt các giá trị để bắt đầu như thế nào? Có phải chỉ là "cách chúng được hiển thị trong Oracle" không?

CHỈNH SỬA:Được rồi, đây là một vài hàm chuyển đổi - nếu bạn có dữ liệu dưới dạng văn bản, chúng sẽ chuyển đổi theo từng cách ...

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. Làm cách nào để giải quyết ORA-00911:lỗi ký tự không hợp lệ?

  2. Cách giải quyết ORA-28000 tài khoản bị khóa

  3. Oracle SQL - Cách lấy 5 giá trị cao nhất của một cột

  4. Chỉ sao lưu lược đồ SQL?

  5. Đưa các trường CLOB vào tệp?