AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

strtohex

Ein Thema von ReVenGer · begonnen am 12. Jun 2007 · letzter Beitrag vom 13. Jun 2007
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
ReVenGer

Registriert seit: 11. Okt 2005
Ort: Hannover
50 Beiträge
 
Delphi XE7 Architect
 
#1

strtohex

  Alt 12. Jun 2007, 16:55
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: strtohex

  Alt 12. Jun 2007, 17:04
Die Datei ist binär Codiert. Dann solltest Du sie mit TFileStream laden und nicht mit Strings arbeiten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Carlo91

Registriert seit: 3. Jun 2006
Ort: Bremen
107 Beiträge
 
Delphi 2006 Architect
 
#3

Re: strtohex

  Alt 12. Jun 2007, 17:05
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 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
Thorben
  Mit Zitat antworten Zitat
Benutzerbild von halinchen
halinchen

Registriert seit: 13. Jun 2006
508 Beiträge
 
Delphi 2007 Professional
 
#4

Re: strtohex

  Alt 12. Jun 2007, 17:07
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]
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: strtohex

  Alt 12. Jun 2007, 17:08
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.:
  showmessage(stringtohex('hi was geht?'#0#12#13#14#0'wieder ich!')); Siehst gleich das die anderen Bytes angezeigt werden.
  Mit Zitat antworten Zitat
Benutzerbild von halinchen
halinchen

Registriert seit: 13. Jun 2006
508 Beiträge
 
Delphi 2007 Professional
 
#6

Re: strtohex

  Alt 12. Jun 2007, 17:12
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 [/edit]
  Mit Zitat antworten Zitat
Carlo91

Registriert seit: 3. Jun 2006
Ort: Bremen
107 Beiträge
 
Delphi 2006 Architect
 
#7

Re: strtohex

  Alt 12. Jun 2007, 17:14
Ja sollte angezeigt werden warum auch nicht lol?
Thorben
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: strtohex

  Alt 12. Jun 2007, 17:15
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]
  Mit Zitat antworten Zitat
Benutzerbild von halinchen
halinchen

Registriert seit: 13. Jun 2006
508 Beiträge
 
Delphi 2007 Professional
 
#9

Re: strtohex

  Alt 12. Jun 2007, 17:20
@Der_Unwissende: Schon klar, das meine Lösung nicht optimal ist. Wie immer . 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
[edit] oh, sry. das war ja Carlo91 und war auch keine Frage... [/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.
  Mit Zitat antworten Zitat
ReVenGer

Registriert seit: 11. Okt 2005
Ort: Hannover
50 Beiträge
 
Delphi XE7 Architect
 
#10

Re: strtohex

  Alt 12. Jun 2007, 17:23
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.
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