Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle के RAW(16) से .NET के GUID में कनवर्ट करें

यदि आप हेक्स अंकों के शामिल मूल्यों (जोड़ों में) को देखते हैं, तो आप देख सकते हैं कि अंतिम 7 बाइट दोनों ही मामलों में समान हैं, लेकिन पहले 9 को थोड़ा बदल दिया गया है।

आपके उदाहरण से जा रहे हैं, लेकिन प्रत्येक जोड़ी को .NET में 00, 11, 22 आदि के रूप में फिर से लिखना और Oracle के प्रासंगिक बाइट को स्विच करना भी हमें मिलता है:

  • .नेट:

    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. ओरेकल ब्लॉब टेक्स्ट सर्च

  2. R12.2 . में असफल कटओवर चरण के बाद पैच को कैसे रोलबैक करें

  3. ओरेकल में टैन () फ़ंक्शन

  4. दो क्लस्टरिंग कारकों की एक कहानी

  5. Oracle ORDER BY और ROWNUM का सही उपयोग कैसे करें?