sql >> データベース >  >> RDS >> Oracle

OracleのRAW(16)から.NETのGUIDに変換する

    16進数の関連する値を(ペアで)見ると、最後の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. DEFAULT NULLのMySQL列-文体の選択ですか、それともそうですか?

    2. oraclesqldeveloperを使用して1つのデータベースから別のデータベースにコピーします-接続に失敗しました

    3. ダウンタイムなしでPostgreSQL10をPostgreSQL11にアップグレードする方法

    4. ダウンロード用の安全なファイル