Hvis du ser på de involverede værdier (i par) af hex-cifre, kan du se, at de sidste 7 bytes er ens i begge tilfælde, men de første 9 er skiftet lidt rundt.
Går vi fra dit eksempel, men omskriver hvert par i .NET som 00, 11, 22 osv. og skifter også den relevante byte af Oracle, får vi:
-
.NET:
00112233445566778899AABBCCDDEEFF
-
Oracle:
33221100554477668899AABBCCFFEEFF
Så det burde være ret nemt at skrive kode for at skifte rundt om de relevante bytes. (Jeg er ret sikker på, at jeg faktisk skrev noget kode til at gøre dette i et tidligere job.)
For at skifte rundt om bytes skal du bare kalde Guid.ToByteArray()
og new Guid(byte[])
for at vende tilbage til en Guid
.
EDIT:Som det sker, er switch-runden ovenfor præcis hvad er Guid
konstruktøren gør, når du sender den et byte-array:
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("-", ""));
}
}
Udskrifter:
00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff
Det kan meget vel gøre det betydeligt nemmere at udføre skiftet... hvordan fik du fat i værdierne til at starte med? Er det bare "hvordan de vises i Oracle"?
EDIT:Okay, her er et par konverteringsfunktioner - hvis du har dataene som tekst, konverterer de hver vej...
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;
}
}