Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi BinToHex Probleme (https://www.delphipraxis.net/161209-bintohex-probleme.html)

delphinia 22. Jun 2011 15:22

Delphi-Version: 5

BinToHex Probleme
 
Hallo habe einen Binary< Wert in der Registry

diesen will ich umwandeln:


Delphi-Quellcode:
            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;
Das funktioniert auch soweit nur ist in "Text" der Wert PLUS einem * am Ende wo kommt das her?

der Binary Wert ist := 00 00 11 00

Was ich damit bezwecke will den Binary in DWORD umwandeln bzw halt in Integer

p80286 22. Jun 2011 16:07

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

Aphton 22. Jun 2011 16:09

AW: BinToHex Probleme
 
Delphi-Quellcode:
            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;
Kommts immernoch?! Falls nein, dann hast du nen Fehler - GetMem(Text, BufferSize) wäre dann die Ausbesserung!

delphinia 22. Jun 2011 16:17

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;

Satty67 22. Jun 2011 21:25

AW: BinToHex Probleme
 
Delphi-Quellcode:
GetMem(Text, BufferSize * 2);
FillChar(Text^, BufferSize, #0);
Da Text ein PAnsiChar ist, sollte das Füllen dann nicht auch mit
Delphi-Quellcode:
BufferSize * 2
arbeiten?

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.

DeddyH 23. Jun 2011 07:16

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.

Blup 23. Jun 2011 07:43

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?

DeddyH 23. Jun 2011 07:46

AW: BinToHex Probleme
 
Laut Hilfe nicht (Unicode-Version):
Zitat:

BufSize legt die Größe von Buffer fest. Text muss auf eine Zeichenfolge zeigen, die mindestens 2*BufSize-Byte groß ist, da jedes Hexadezimalzeichen zwei Bytes darstellt.

Blup 23. Jun 2011 09:06

AW: BinToHex Probleme
 
Hier wird mit PAnsiChar gearbeitet:
Zitat:

Text gibt einen nullterminierten String zurück, der den in Buffer übergebenen Wert als Hexadezimalzahl darstellt.

BufSize legt die Größe von Buffer fest. Text muss auf eine Zeichenfolge zeigen, die mindestens 2*BufSize-Byte groß ist, da jedes Hexadezimalzeichen zwei Bytes darstellt.
Für die Funktion BinToHex mag das Nullzeichen am Ende egal sein (BuffSize wird ja übergeben).
Aber ShowMessage möchte sicher auch wissen, wie lang der übergebene Text ist.

DeddyH 23. Jun 2011 09:09

AW: BinToHex Probleme
 
Bei solchen Dingen gehe ich persönlich immer auf Nummer Sicher und schreibe noch
Delphi-Quellcode:
SetLength(StringVar, StrLen(PChar(StringVar)));
dahinter, bevor ich auf den ermittelten String zugreife.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz