2013-02-12 12 views
5

Delphi'deki kayıt defterindeki binary değeri olarak saklanan bir GUID değerini okumayı deniyorum. BintoHex ile okuduğumda, ancak sonuç ters sırada. Bayt takas etmek zorundayım ama BinToHex'in bunu yapacağını düşündüm. Okuma kayıt defterindeki GUID değeri

Ben bu konuya refere ama doğru çözümü bulamıyor: how to convert byte array to its hex representation in Delphi O küçük Eendian nedeniyle olduğu görülmektedir. s için

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

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

Çıktı: Aşağıda

, sen burada

kayıt

saklanan GUID görebilirsiniz benim kodudur 90E24D373F126545916439C4925E467B

GUID FOLDERID_Downloads GUID olmalıdır:
{374DE290-123F-4565-9164-39C4925E467B} Here

cevap

8

Bir GUID ikili biçimde bir kayıt olarak en iyi düşünce yardım edin. Aslında Delphi'de kayıt zaten var - TGUID.

Yapmanız gereken tek şey, ilgili baytları doğrudan TGUID türünde bir değişkene kopyalamaktır ve işiniz bitti. Bir dize gösterimi istiyorsanız, GUIDToString kullanın.

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

Bu, tüm endian sorunlarını otomatik olarak ele alacaktır. en TGUID ilanına bir göz atalım:

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

Kodunuz bayt düz bir dizi olarak bu davranır. Ancak, kayıtta, D1, D2 ve D3 küçük bir endian makinesinde ayrılmaz tiplerdir. Bu nedenle kodunuz, ilk 4 bayt, D1'a ait olanları tersine çevirir. Daha sonra D2'un iki baytını ve ayrıca D3'un iki baytını tersine çevirir. Tabi ki GUID'in sonunda 8 bayt dizisi tersine çevrilmez.

Bu nedenle, tüm baytların kendilerini kolayca değiştirebiliyor olsanız da, bunu yapmak için bir kayıt kullanmak daha iyidir ve bir ikili GUID kaydını doğru biçimlendirilmiş bir GUID dizesine dönüştüren yardımcı işlevinden yararlanın.

+0

GUID, ikili kayıt defteri değerinde depolanan tek şey değil. Yani, bir arabellekte okumak ve bu tamponda $ e konumunda TGUID okumak zorundayım. Arabellek ("$ e" konumunda) bir "hareket" inden şüpheleniyorum, bayt-byte kopyası olduğu için GUID bu işi yapmaz. Bu doğru mu? Ne öneriyorsun David? – user382591

+1

A 'Move' işi mükemmel şekilde yapacak. Verileri bir "TGUID" üzerine karıştırın ve iş bitti. "PGUID" için bir oyuncu kullanmadan hareketsiz yapılabilir. En son güncelleme size nasıl olduğunu gösterir. –

+1

David, sen benim Guru'msın – user382591

İlgili konular