Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi strtohex (https://www.delphipraxis.net/93873-strtohex.html)

ReVenGer 12. Jun 2007 15:55


strtohex
 
Hi zusammen,

ich möchte eine Spielstand Datei als Hex ins Memo laden, nur bekomm ich die Umwandlung
von String zu Hex nicht so wirklich gebacken.

Ein Hex Editor zeigt mir zumindest andere Werte.

Delphi-Quellcode:
function StringToHex(s:string) : string;
var t : integer;
begin
result := ' ';
for t := 1 to length(s) do begin
if t = length(s) then
result := result + IntToHex(ord(s[t]),2)
else
result := result + IntToHex(ord(s[t]),2) + ' ';
end;
end;
mal ein Auszug aus der Datei '...ÿ..ö.üÿæ.....'

so zeigt es der Hex Editor an '0E 00 90 FF 00 00 F6 13 FC FF E6 11 10 00 00 00'

und so mein Programm '2E 2E 2E FF 2E 2E F6 2E FC FF E6 2E 2E 2E 2E 2E'

Was läuft da schief?

Bernhard Geyer 12. Jun 2007 16:04

Re: strtohex
 
Die Datei ist binär Codiert. Dann solltest Du sie mit TFileStream laden und nicht mit Strings arbeiten.

Carlo91 12. Jun 2007 16:05

Re: strtohex
 
Hi,
dein Programm macht alles richtig dein fehler ist das du den "String" den der Hex-Editor dir wieder gegeben hat in deinem programm benutzt:

Zitat:

Zitat von ReVenGer
mal ein Auszug aus der Datei '...ÿ..ö.üÿæ.....'

Das problem dabei ist das der hex-editor alle bytes die er nicht als "zeichen" wieder geben kann als . anzeigt(Hexwert: 2E).

Kurz gesagt kopiere den string nicht aus dem Hex-Editor sondern lade die datei in dein programm rein.

MfG Carlo

halinchen 12. Jun 2007 16:07

Re: strtohex
 
Für mich sieht es aus, als würdest du die Datei als String einlesen und die dann in Hex umwandeln.

Macht man das nicht mit einem FileStream, und liest Byte für Byte aus und wandelt den in Hex um?

So denke ich mir das. (Es kann natürlich auch sein, das beides geht, aber an deinem gezeigten Code sehe ich kein Fehler)
Delphi-Quellcode:
var
 fs:TFileStream;
 str : String //was am Ende Rauskommt
 i : Integer;
 b : Byte;
begin
 fs := TFileStream.Create('Datei', fm_OpenRead);
 try
    For i := 0 to fs.Size do begin
      fs.ReadBuffer(b,sizeof (b));
      //oder fs.ReadByte(b); <-- bin mir nichtt sicher
      str := Str + '|' + IntToHex(b,2); <-- '|' ist der Trenner
    end;
 finally
 fs.Free;
 end;
end;
ungetestet

[edit] Hmm... Zum 1. Mal kein roter Kasten... [/edit]

ErazerZ 12. Jun 2007 16:08

Re: strtohex
 
Nunja, deine Funktion ist in Ordnung. Nur dein String ist einwenig nicht in Ordnung weil die punkte sind in Hex 0x2E, der HexEditor kann diese Zeichen einfach nicht darstellen.
Z.B.:
Delphi-Quellcode:
  showmessage(stringtohex('hi was geht?'#0#12#13#14#0'wieder ich!'));
Siehst gleich das die anderen Bytes angezeigt werden.

halinchen 12. Jun 2007 16:12

Re: strtohex
 
Zitat:

Zitat von Carlo91
Das problem dabei ist das der hex-editor alle bytes die er nicht als "zeichen" wieder geben kann als . anzeigt(Hexwert: 2E).

Aber wenn der das Zeichen nicht kennt (z.B. #13) dann zeigt er einen Punkt im Textmodus an. Aber ein normaler Hex-Editor sollte doch dann dort wo er die Daten als Hex anzeigt die 13 als Hex anzeigen, oder?

[edit] Ich habs jetzt kapiert, was du meinst. Da stand wer auf meiner Internetleitung :mrgreen: [/edit]

Carlo91 12. Jun 2007 16:14

Re: strtohex
 
Ja sollte angezeigt werden warum auch nicht lol?

Der_Unwissende 12. Jun 2007 16:15

Re: strtohex
 
Zitat:

Zitat von halinchen
Delphi-Quellcode:
    For i := 0 to fs.Size do begin
      fs.Read(b,sizeof (b));
      //oder fs.ReadByte(b); <-- bin mir nichtt sicher
      str := Str + '|' + IntToHex(b,2); <-- '|' ist der Trenner
    end;

Hi,
an sich sollte der hier gepostete Weg auf jeden Fall funktionieren. Wenn Du das so machst, solltest Du jedoch noch besser noch mit einem kleinen Puffer arbeiten. In diesem Fall liest Du jedes Byte einzeln in der Schleife ein, dass dauert und dauert und dauert. Viel schneller geht es, wenn Du gleich einen ganzen Haufen Bytes in ein Array liest und die dann in einem Rutsch bearbeitest.
Delphi-Quellcode:
var buffer: TByteDynArray;
    readBytes: Integer;
// wie gehabt!
...
begin
  // 1024 Byte Puffer
  setLength(buffer, 1024);
// wie gehabt!
...
  readBytes := fs.Readbuffer(buffer[0], length(buffer));
  while readBytes > 0 do
  begin
    for i := 0 to readBytes - 1 do
    begin  
      str := Str + '|' + IntToHex(buffer[i],2); <-- '|' ist der Trenner
    end;
  end;
Auch das mit dem String kann man noch effizienter machen, indem man hier für jedes Zeichen im Puffer (readBytes) einfach je 3 Byte (2 Byte Hex-Wert + 1 Byte Trenner) alloziert und dann direkt am richtigen Index einfügt.

Gruß Der Unwissende

[edit]
Fehler korrigiert, muss natürlich read und nicht readBuffer sein! Danke @halinchen!
[/edit]

halinchen 12. Jun 2007 16:20

Re: strtohex
 
@Der_Unwissende: Schon klar, das meine Lösung nicht optimal ist. Wie immer :mrgreen:. Nein Spaß bei Seite. Sollte ja nur ein Anschauungsmaterial sein.

Allerdings nahm bei mir mal ReadBuffer bei einem älteren Projekt keine variablen Arrays an. Gleich nochmal testen und lernen :coder2:
[edit] oh, sry. das war ja Carlo91 und war auch keine Frage... :wall: [/edit]
@ReVenGer: Du sollst die Daten nicht aus dem Hex-Editor kopieren, sondern selber die Datei einlesen. Den sonst ist dort wo z.B #13 steht in deinem Programm ein Punkt. Sprich: Beide Programme arbeiten mit unterschiedlichem Ausgangsmaterial.

ReVenGer 12. Jun 2007 16:23

Re: strtohex
 
ahhhhhhhhh.... *klick*

erstmal danke für die schnellen antworten!
ich habe fälschlicherweise angenommen, das er das nur nicht anzeigen kann,
aber den tatsächlichen wert übernimmt.

super, dann kann ich ja auch gezielt nach bytes suchen und diese verändern.

speichern sollte genau rückwärts erfolgen richtig?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 Uhr.
Seite 1 von 4  1 23     Letzte »    

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