5

我尝试读取存储为binaryDelphi 注册表中的值的 GUID 值。当我用 BintoHex 阅读它时,结果是相反的。看来我必须交换字节,但我认为 BinToHex 会这样做。

我参考了这个线程,但我找不到正确的解决方案: 如何将字节数组转换为 Delphi 中的十六进制表示, 这似乎是由于小 Eendian。

下面,您可以看到存储在注册表中的 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}

请帮忙 这里

4

1 回答 1

8

最好将二进制形式的 GUID 视为记录。事实上,在 Delphi 中,记录已经存在——它是TGUID.

您需要做的就是将相关字节直接复制到类型变量中TGUID,您的工作就完成了。如果你想要一个字符串表示,使用GUIDToString.

var
  GUID: TGUID;
  strGUID: string;
....
GUID := PGUID(PAnsiChar(buffer)+14)^;
strGUID := GUIDToString(GUID);

这将自动处理所有字节序问题。让我们看一下 的声明TGUID

TGUID = packed record
  D1: LongWord;
  D2: Word;
  D3: Word;
  D4: array[0..7] of Byte;
end;

您的代码将其视为直接的字节数组。但是,在记录中D1D2D3是小端机器上的整数类型。所以你的代码反转了前 4 个字节,那些属于D1. 然后它反转 的两个字节D2,以及 的两个字节D3。当然,GUID 末尾的 8 字节数组不会反转。

因此,虽然您可以自己轻松地进行所有字节交换,但最好使用记录来执行此操作,并利用将二进制 GUID 记录转换为格式正确的 GUID 字符串的辅助函数。

于 2013-02-12T08:46:26.533 回答