c# - 从 Oracle 的 RAW(16) 转换为 .NET 的 GUID

标签 c# arrays oracle guid

我在手动调试 Guid 值从 .NET 到 Oracle 不同的 .NET 应用程序时遇到困难。

  • 其中 C# 读取:
    • 17D89D326C2142D69B989F5201288DBF
  • Oracle 读取:
    • 329DD817216CD6429B989F5201288DBF

我如何能够手动调试,即从 C# 的 GUID 能够将该值粘贴到 oracle 查询中并获得正确的结果(反之亦然)?

最佳答案

如果您查看十六进制数字所涉及的值(成对),您会发现最后 7 个字节在这两种情况下是相同的,但前 9 个字节稍微调换了一下。

根据您的示例,将 .NET 中的每一对重写为 00、11、22 等,并切换 Oracle 的相关字节,我们得到:

  • .NET:

    00112233445566778899AABBCCDDEEFF
    
  • 甲骨文:

    33221100554477668899AABBCCFFEEFF
    

因此编写代码来切换相关字节应该相当容易。 (事实上​​ ,我很确定我在以前的工作中编写了一些代码来执行此操作。)

要切换字节,您只需调用 Guid.ToByteArray()new Guid(byte[]) 返回到 指南

编辑:碰巧的是,当你向它传递一个字节数组时,上面的循环 完全是 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;
    }

}

关于c# - 从 Oracle 的 RAW(16) 转换为 .NET 的 GUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7289734/

相关文章:

Oracle 10g - 确定触发器上次更新的日期

oracle - 当脚本中有 "connected"时,我可以阻止 SQL*Plus 显示 "connect"吗?

c# - 具有多个订阅者和实时更新的实时数据缓存

c# - 根据标准比较两个对象

c# - 转换为实现接口(interface)的通用抽象类

javascript - ES2015 的 React 数组映射问题

c# - 在 NavigationService.GoBack 上使用变量

c - C 中的数组初始化问题

javascript - 如何检查 JavaScript 数组中的空字符串?

Java JDBC 连接和 Oracle