我尝试读取在Delphiregistry中存储为一个binary
值的GUID值。 当我用BintoHex读它时,结果却是相反的。 看来我必须交换字节,但我认为BinToHex会做到这一点。
我提到这个线程,但我找不到正确的解决scheme: 如何在Delphi中将字节数组转换为其hex表示它似乎是由于小Eendian。
下面,你可以看到存储在registry中的GUID
这是我的代码:
var s : string; buffer : pointer; ... begin getmem(buffer, 1024*1024); .... reg.ReadBinaryData(iValueOfregistry, buffer^, 1024*1024); .... bintohex(pointer(longint(buffer)+14), PChar(s), 32);
s的输出: 90E24D373F126545916439C4925E467B
GUID应该是FOLDERID_Downloads GUID:
{374DE290-123F-4565-9164-39C4925E467B}
请帮忙
二进制形式的GUID最好被认为是一个记录。 事实上,在德尔福记录已经存在 – 这是TGUID
。
您只需将相关字节直接复制到TGUID
类型的变量中,并完成您的工作。 如果你想要一个字符串表示,使用GUIDToString
。
var GUID: TGUID; strGUID: string; .... GUID := PGUID(PAnsiChar(buffer)+14)^; strGUID := GUIDToString(GUID);
这将自动处理所有的endian问题。 我们来看一下TGUID
的声明:
TGUID = packed record D1: LongWord; D2: Word; D3: Word; D4: array[0..7] of Byte; end;
您的代码将其视为一个直接的字节数组。 但是,在记录中, D1
, D2
和D3
是小端机上不可或缺的一部分。 所以你的代码反转了前4个字节,那些属于D1
。 然后它反转D2
的两个字节,还有D3
的两个字节。 当然,GUID结尾的8个字节的数组不会颠倒过来。
所以,尽管你可以很容易地完成所有的字节交换工作,但是使用一个记录来完成这个过程要好得多,并且可以利用辅助函数将二进制GUID记录转换为格式正确的GUID字符串。