5

binaryDelphi のレジストリに値として保存されている GUID 値を読み取ろうとしています。BintoHexで読み込んでみると逆順になってしまいます。バイトをスワップする必要があるようですが、BinToHex でできると思いました。

このスレッドを参照しましたが、適切な解決策が見つかりません: Delphi でバイト配列を 16 進表現に変換する方法 それは小さな 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;

コードは、これをバイトのストレート配列として扱います。ただし、レコードでは、 、D1D2およびD3はリトルエンディアン マシンの整数型です。したがって、コードは最初の 4 バイト、つまりD1. 次に、 の 2 バイトと の 2 バイトを反転しD2ますD3。もちろん、GUID の末尾にある 8 バイトの配列は反転されません。

そのため、すべてのバイト スワップを自分で簡単に実行できますが、レコードを使用してバイナリ GUID レコードを適切にフォーマットされた GUID 文字列に変換するヘルパー関数を利用する方がはるかに優れています。

于 2013-02-12T08:46:26.533 に答える