![]() |
Delphi-Version: 5
BinToHex Probleme
Hallo habe einen Binary< Wert in der Registry
diesen will ich umwandeln:
Delphi-Quellcode:
Das funktioniert auch soweit nur ist in "Text" der Wert PLUS einem * am Ende wo kommt das her?
BufferSize := Reg.GetDataSize('Typename');
GetMem(Buffer, BufferSize); GetMem(Text, BufferSize * 2); try Reg.ReadBinaryData('Typename', Buffer^, BufferSize); BinToHex(Buffer, Text, BufferSize); finally FreeMem(Text); FreeMem(Buffer); end; der Binary Wert ist := 00 00 11 00 Was ich damit bezwecke will den Binary in DWORD umwandeln bzw halt in Integer |
AW: BinToHex Probleme
Also zu nächst würde mich das Ergebnis interessieren, ist das x04,x4,04 oder 12 oder 0C oder was?
Dann frage ich mich mit welchenPuffergrößen Du arbeitest. für ein Byte benötigst Du 8 Bit = 8 Zeichen. in der Hexadezimaldarstellung solltest Du aber mit 2 Zeichen auskommen, und nicht die doppelte Menge benötigen. Und woher weißt Du denn was in "Text" steht? Gruß K-H |
AW: BinToHex Probleme
Delphi-Quellcode:
Kommts immernoch?! Falls nein, dann hast du nen Fehler - GetMem(Text, BufferSize) wäre dann die Ausbesserung!
BufferSize := Reg.GetDataSize('Typename');
GetMem(Buffer, BufferSize); GetMem(Text, BufferSize * 2); FillChar(Text^, BufferSize, #0); try Reg.ReadBinaryData('Typename', Buffer^, BufferSize); BinToHex(Buffer, Text, BufferSize); finally FreeMem(Text); FreeMem(Buffer); end; |
AW: BinToHex Probleme
@Aphton
ja das hier ist meine komplette procedure:
Delphi-Quellcode:
var
Buffer, Text: PAnsiChar; BufferSize: Integer; reg: TRegistry; begin reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; if reg.OpenKey('\Software\MikroFil', false) then begin if (reg.ValueExists('Typename')) then if (reg.GetDataType('Typename') = rdBinary) then begin BufferSize := Reg.GetDataSize('Typename'); GetMem(Buffer, BufferSize); GetMem(Text, BufferSize * 2); FillChar(Text^, BufferSize, #0); try Reg.ReadBinaryData('Typename', Buffer^, BufferSize); BinToHex(Buffer, Text, BufferSize); finally ShowMessage(Text); <----------------- Hier habe ich dann den * am Ende des sonst richtigen Wertes FreeMem(Text); FreeMem(Buffer); end; end; end; finally FreeAndNil(reg); end; |
AW: BinToHex Probleme
Delphi-Quellcode:
Da Text ein PAnsiChar ist, sollte das Füllen dann nicht auch mit
GetMem(Text, BufferSize * 2);
FillChar(Text^, BufferSize, #0);
Delphi-Quellcode:
arbeiten?
BufferSize * 2
Delphi-Quellcode:
.
FillChar(Text^, BufferSize * 2, #0);
Sonst füllt man ja nur den Bereich, der sowieso mit den richtigen Daten gefüllt wird und kann garnicht testen, ob im Puffer mehr liegt. |
AW: BinToHex Probleme
Wäre es nicht generell angesagt, nicht mit 2, sondern mit SizeOf(Char) zu multiplizieren? Dann muss man sich um die Ansi-/Unicode-Problematik keinen Kopf machen.
|
AW: BinToHex Probleme
Sollte "Text" nicht um ein Zeichen länger sein, um mit einem abschließenden #0-Zeichen das Ende der Zeichenkette zu markieren?
|
AW: BinToHex Probleme
Laut Hilfe nicht (Unicode-Version):
Zitat:
|
AW: BinToHex Probleme
Hier wird mit PAnsiChar gearbeitet:
Zitat:
Aber ShowMessage möchte sicher auch wissen, wie lang der übergebene Text ist. |
AW: BinToHex Probleme
Bei solchen Dingen gehe ich persönlich immer auf Nummer Sicher und schreibe noch
Delphi-Quellcode:
dahinter, bevor ich auf den ermittelten String zugreife.
SetLength(StringVar, StrLen(PChar(StringVar)));
|
AW: BinToHex Probleme
habe nun drei stunden rumgespielt - versteh zwar nur die Hälfte; aber auch ein blinde Huhn findet mal ein Korn!
Das hier funktioniert, zumindest bis jetzt...
Delphi-Quellcode:
ShowMessage enthält nun genau den richtigen String!
var
Len: Integer; Buffer: array[0..4095] of Byte; txt: string; begin [....] Len := Reg.GetDataSize('Typename'); if Len > 0 then begin Reg.ReadBinaryData('Typename', Buffer, SizeOf(Buffer)); SetLength(txt, Min(Len, SizeOf(Buffer)) * 2); BinToHex(@Buffer, PChar(txt), Len); end; ShowMessage(txt); Mag das jemand mir mal jemand gegenprüfen ob das auch nicht nur in meinem hier vorliegendem Beispiel standhält? EDIT: Was bedeutet das @ in Delphi? Was bedeutet das ^ in Delphi? Frage nur da man danach schlecht hier oder bei Google suchen kann... |
AW: BinToHex Probleme
@Var = Speicheradresse von Var
^Var = Zeiger auf Var Var^ = Inhalt, der hinter dem Zeiger Var steckt |
AW: BinToHex Probleme
Zitat:
Delphi-Quellcode:
bedeutet „Die Adresse von Foobar im Speicher“ (Referenzierungsoperator)
@Foobar
Delphi-Quellcode:
bedeutet „Ding, das an dieser Adresse im Speicher steht“ (Dereferenzierungsoperator)
Adresse^
Achja, und
Delphi-Quellcode:
bedeutet „Zeiger auf einen Datentyp“.
^Datentyp
Delphi-Quellcode:
wäre z.B. ein Zeiger auf einen Integer. Das braucht man zum dereferenzieren, damit der Compiler weiß, was für ein Typ sich überhaupt hinter einer Adresse verbirgt.
^Integer
Für eine genauere Erklärung kannst du dir dieses Pointer-Tutorial aus der DP durchlesen. |
AW: BinToHex Probleme
Danke Euch! :) werde ich heute abend lesen!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz