我在手动调试.NET应用程序时遇到困难,其中Guid值从.NET到Oracle不同.
17D89D326C2142D69B989F5201288DBF329DD817216CD6429B989F5201288DBF我怎么能够手动调试,即从C#的GUID能够将该值粘贴到oracle查询中并获得正确的结果(反之亦然)?
我正在创建这样的GUID
Guid g = new Guid(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF });
Console.WriteLine(g);
Run Code Online (Sandbox Code Playgroud)
这输出
03020100-0504-0706-0809-0a0b0c0d0e0f
Run Code Online (Sandbox Code Playgroud)
根据维基百科,guid中有四个部分,这解释了为什么字节顺序在四组中切换.然而,维基百科文章还指出所有部分都以Big Endian格式存储.显然前三部分不是Big Endian.guid的GetBytes()方法以与创建相同的顺序返回字节.这种行为的解释是什么?
我的应用程序使用DataReader在ADO.NET中编写的自定义数据访问层与Oracle和SQL Server数据库进行交互.现在我遇到了GUID(我们用于主键)和Oracle RAW数据类型之间转换的问题.插入oracle很好(我只是在System.Guid上使用ToByteArray()方法).当我从数据库加载记录时,问题是转换回System.Guid.目前,我正在使用从ADO.NET获得的字节数组传递给System.Guid的构造函数.这似乎有效,但数据库中出现的Guids与我以这种方式生成的Guids不对应.
我无法更改数据库架构或查询(因为它重用于SQL Server).我需要代码将Oracle中的字节数组转换为正确的Guid.
我的应用程序内部使用通过sys_guid()生成的RAW(16)guids.
最近我开始将我获得guid的Active Directory用户关联起来,格式为:00000000-0000-0000-0000-00000000000
以下两个函数是否正确执行此转换?
找到以下网站:
create or replace
FUNCTION RAWTOGUID
( RawData IN RAW
) RETURN VARCHAR AS
BEGIN
declare HexData varchar(32) := rawtohex(RawData);
begin
return
substr(HexData, 7, 2)
|| substr(HexData, 5, 2)
|| substr(HexData, 3, 2)
|| substr(HexData, 1, 2)
|| '-'
|| substr(HexData, 11, 2)
|| substr(HexData, 9, 2)
|| '-'
|| substr(HexData, 15, 2)
|| substr(HexData, 13, 2)
|| '-'
|| substr(HexData, 17, 4)
|| '-'
|| substr(HexData, 21, 12);
end;
END RAWTOGUID;
Run Code Online (Sandbox Code Playgroud)
添加以下站点:
http://dbaspot.com/oracle-server/69226-guid-char-conversion-function.html
想出了这个功能来反过来: …
我有一个外部数据库,正在向我提供信息.一个将其数据保存为本机GUID格式,而我的其他数据源提供标准.NET GUID格式字符串.
有没有一种整洁的方式从Native GUID转换为GUID结构?
还有任何验证位来确定提供的值是否为Native GUID?如果有的话我似乎找不到任何东西.
区别如下:
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
Run Code Online (Sandbox Code Playgroud)
Data1,Data2和Data3的字节顺序相反,但Data4保持不变,请参阅http://en.wikipedia.org/wiki/Globally_unique_identifier了解更多信息
在 C# 立即窗口中输入以下代码时,会产生一些不寻常的结果,我只能假设这是因为在内部System.Guid翻转了某些字节:
使用从 0 到 15 的有序字节数组时
new Guid(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15})
[03020100-0504-0706-0809-0a0b0c0d0e0f]
Run Code Online (Sandbox Code Playgroud)
使用值为 0 到 15 的无序字节数组时
new Guid(new byte[] {3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15})
[00010203-0405-0607-0809-0a0b0c0d0e0f]
Run Code Online (Sandbox Code Playgroud)
为什么前 3 组翻转了?
我试图模仿C#应用程序将UUID转换为Base64值的方式.出于某种原因,我可以获得字符串的一部分以匹配预期值,但不是整个字符串.
我得到的C#代码:
public static string ToShortGuid(this Guid newGuid) {
string modifiedBase64 = Convert.ToBase64String(newGuid.ToByteArray())
.Replace('+', '-').Replace('/', '_') // avoid invalid URL characters
.Substring(0, 22);
return modifiedBase64;
}
Run Code Online (Sandbox Code Playgroud)
我在Python 3.6中尝试过的:
import uuid
import base64
encode_str = = base64.urlsafe_b64encode(uuid.UUID("fa190535-6b00-4452-8ab1-319c73082b60").bytes)
print(encode_str)
Run Code Online (Sandbox Code Playgroud)
"fa190535-6b00-4452-8ab1-319c73082b60"是已知的UUID,该应用程序显然使用上述c#代码生成"NQUZ-gBrUkSKsTGccwgrYA"的"ShortGuid"值.
当我通过我的Python代码处理相同的UUID时,我得到:" - hkFNWsARFKKsTGccwgrYA =="
从这两个输出字符串中,此部分匹配:"KsTGccwgrYA",但其余部分不匹配.