2013-02-12 11 views
5

Provo a leggere un valore GUID memorizzato come valore binary nel Registro di sistema in Delphi. Quando l'ho letto con BintoHex, ma il risultato è nell'ordine inverso. Sembra che io debba scambiare byte ma ho pensato che BinToHex lo avrebbe fatto.Leggi il valore GUID memorizzato nel registro

ho denominati nel questa discussione, ma non riesco a trovare la giusta soluzione: how to convert byte array to its hex representation in Delphi Sembra che sia a causa di poco Eendian.

Qui di seguito, è possibile vedere il GUID memorizzato nel registro

Ecco il mio codice:

var 
s : string; 
buffer : pointer; 
... 

begin 
getmem(buffer, 1024*1024); 
.... 
reg.ReadBinaryData(iValueOfregistry, buffer^, 1024*1024); 
.... 
bintohex(pointer(longint(buffer)+14), PChar(s), 32); 

Uscita per s: 90E24D373F126545916439C4925E467B

GUID dovrebbe essere FOLDERID_Downloads GUID:
{374DE290-123F-4565-9164-39C4925E467B}

Aiutateci Here

risposta

8

un GUID in forma binaria è meglio pensato come un record. Effettivamente in Delphi il record già esiste - è TGUID.

Tutto ciò che dovete fare è copiare i byte rilevanti direttamente in una variabile di tipo TGUID e il vostro lavoro è finito. Se si desidera una rappresentazione di stringa, utilizzare GUIDToString.

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

Questo si occuperà automaticamente di tutti i problemi di endian. Diamo uno sguardo alla dichiarazione di TGUID:

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

Il codice considera questo come un array di byte dritto. Tuttavia, nel record, D1, D2 e D3 sono tipi interi su una macchina little endian. Quindi il tuo codice inverte i primi 4 byte, quelli che appartengono a D1. Quindi inverte i due byte di D2 e anche i due byte di D3. La matrice di 8 byte alla fine del GUID non è invertita, ovviamente.

Quindi, sebbene sia possibile eseguire facilmente lo scambio di tutti i byte, è molto meglio utilizzare un record per farlo e sfruttare la funzione di supporto che converte un record GUID binario in una stringa GUID formattata correttamente.

+0

Il GUID non è l'unica cosa memorizzata nel valore di registro binario. Quindi, devo leggerlo in un buffer e leggere il TGUID alla posizione $ e in quel buffer. Sospetto che una "mossa" dal buffer (alla posizione $ e) al GUID non faccia il lavoro perché è una copia da byte a byte. È vero? Cosa suggerisci, David? – user382591

+1

A 'Move' farà il lavoro perfettamente. Basta mescolare i dati su un 'TGUID' e il lavoro è finito. Può essere fatto senza muovere usando un cast per 'PGUID'. L'ultimo aggiornamento mostra come. –

+1

David, tu sei il mio Guru – user382591