Ако погледнете включените стойности (по двойки) шестнадесетични цифри, можете да видите, че последните 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;
}
}