![]() |
Problem mit HexToDez
Hi,
ich muss Hex nach Dez umwandeln und habe diese Funktion dafür:
Delphi-Quellcode:
Problem ist nur, dass diese Funktion $A, $B, $C, $D, $E und $F, statt A, B, C, D, E und F erwartet. Wie kann man in einem String vor die Fundstelle von allen im String vorkommenden Buchstaben ein $ setzen, ohne irgendwelche Zeiche zu löschen ? Beispiel:
function TfrmMain.HexToDez(s : String) : Integer;
var c : Integer; l : Integer; begin Val(s, l, c); Result := l; end; 9C wird zu: 9$C
Delphi-Quellcode:
Ich steh gerade total auf dem Schlauch....
for m := 1 to Length(convert) do
begin if (convert[i] = 'A') or (convert[i] = 'B') or (convert[i] = 'C') or (convert[i] = 'D') or (convert[i] = 'E') or (convert[i] = 'F') then --> was muss hier hin ? <-- end; |
Re: Problem mit HexToDez
wir wärs damit:
Delphi-Quellcode:
Edit: Ah, ich verstehe dein Problem.
function TfrmMain.HexToDez(s : String) : Integer;
var c : Integer; l : Integer; begin Val('$'+s, l, c); Result := l; end; Hexadezimale Zahlen werden (in Delphi) so geschrieben: $3F = $3f = 3*16+15 = 63 $6 = 6 $A = 10 $1AF4 = 1*4096 + 10*256 + 15*16 + 4 = 6900 Da gibts nicht for jedem Buchstaben ein "$", nur eins am Anfang. |
Re: Problem mit HexToDez
Auf die Idee bin ich auch schon gekommen, aber wenn der String 9C wäre, würde er dann $9C umrechnen. Das geht natürlich nicht.
|
Re: Problem mit HexToDez
Wo ist das Problem?
|
Re: Problem mit HexToDez
@sirius:
Dein Code müsste laut deinem Edit dann doch funktionieren. Er liefert bei 9C aber 0 zurück. Fehler lag auf meiner Seite, sry. |
Re: Problem mit HexToDez
Zitat:
Delphi-Quellcode:
-->156
function hextodez(s:string):integer;
var l,c:integer; begin val('$'+s,l,c); result:=l; end; procedure TForm1.Button1Click(Sender: TObject); begin memo1.lines.add(inttostr(hextodez('9C'))); end; |
Re: Problem mit HexToDez
Sry, hatte da irgendwo einen Fehler drinnen, behoben. Thx.
|
Re: Problem mit HexToDez
Moin Nils,
warum nimmst Du nicht
Delphi-Quellcode:
:gruebel:
StrToInt
|
Re: Problem mit HexToDez
Das kann es auch, ich weiß.... Ich will aber irgendwie eine Übersicht in meinem großen Projekt und sofort sehen, was was ist. StrToInt macht für mich gedanklich die 1:1-Umstezung von Str zu Int und nicht Hex, deshalb.
|
Re: Problem mit HexToDez
Moin Nils,
ja und? Dann ruf es doch in Deiner Funktion HexToDez auf ;-) |
Re: Problem mit HexToDez
Ich habe ein riesen Problem:
4C --> 76 korrekt 21 --> 0 falsch 0C --> 0 falsch Der Code hat sich nicht geändert:
Delphi-Quellcode:
Der Aufruf von HexToDez sieht so aus:
function TfrmMain.HexToDez(s : String) : Integer;
var c : Integer; l : Integer; begin Val('$'+s, l, c); Result := l; end;
Delphi-Quellcode:
if Copy(line, j, 4) = 'int ' then
begin tmp := Trim(Copy(line, j+4, MaxInt)) + ' '; k := 1; while tmp[k] in ['0'..'9', 'A'..'F', 'a'..'f'] do inc(k); line := Copy(line, 1, j+3) + Copy(Tmp, 1, k-1); asd := HexToDez(line); A.Lines[i] := IntToStr(asd); end; |
Re: Problem mit HexToDez
Hi,
schon mal ausgegeben, was reingeht nach hextodex ? Diese "line" sieht mir etwas komisch in der Zusammenstellung aus. Aus diesem Code-Fragment ist nicht vollständig zu entnehmen, was du da zusammenkopierst, insbesondere der erste Teil. Gruss |
Re: Problem mit HexToDez
In line steht (kA warum) int 21. Vlt. liegt es daran, aber ich weiß nicht, warum die Konvertierung trotzdem schiefläuft, denn i, n und t gibt es in Hex nicht.
|
Re: Problem mit HexToDez
Hallo Nils,
die Funktion HexToDez ist fehlertoleranter als du denkst. Versuche es mal mit diesem Aufruf:
Delphi-Quellcode:
Gruß Hawkeye
if (Copy(line, j, 4) = 'int ') then
begin asd := HexToDez(Copy(line, 5, MaxInt)); A.Lines[i] := IntToStr(asd); end; |
Re: Problem mit HexToDez
Danke, es funktioniert endlich :)
|
Re: Problem mit HexToDez
Hi,
da es immer noch um die selbe Funktion geht, poste ich einfach wieder hier ein (leider :(). Ich habe jetzt das Problem, dass mir die obengenannte Funktion 09 (Hex) in 9 (Dez) verwandelt. Wie kann man das verhinden ? Ich habe bisher versucht, einfach alle Nullen durch irgendein Zeichen, außer A-F oder 0-9 zu ersetzen und diese verwandelte Nullen am Ende wieder zu Nullen zu machen, hat nicht funktioniert, da l leider Integer sein muss und die Zurückwandlung nicht funktionieren kann (auch mit IntToStr oder StrToInt nicht). Wer sie nochmal sehen will:
Delphi-Quellcode:
Das sollte dann endlich mein letztes Problem mit dieser Funktion gewesen sein :).function TfrmMain.HexToDez(s : String) : Integer; var c : Integer; l : Integer; begin Val('$'+s, l, c); Result := l; end; |
Re: Problem mit HexToDez
Moin Nils,
Zitat:
|
Re: Problem mit HexToDez
Natürlich ist das korrekt, aber wenn ich das weiter nach Binär konvertieren würde, würde dann die 0 schwer ins Gewicht fallen, weil diese dann dort einfach fehlt. Mag heißen:
9 = 1001 09 = 00001001 |
Re: Problem mit HexToDez
Zitat:
|
Re: Problem mit HexToDez
Du hast es nicht verstanden: das ist 8-bit, nicht 4-Bit.
|
Re: Problem mit HexToDez
Hi,
dann sollte deine Routine, die nach binär konvertiert einfach soviel nullen davor setzen bis es wieder acht Zeichen sind. Ist das so schwer. Es gab mal eine Funktion PadLW (string, padchar, len), die einen String mit dem PadChar verlängert bis er die Länge len hat.
Delphi-Quellcode:
Vielleicht hilft dir das.Function PadLw (const s:string; padchar:char; len:integer):string; begin // pad a string from the left result := s; while length(result)<len do result := padchar + result; end; Function PadRw (const s:string; padchar:char; len:integer):string; begin // pad a string to the right result := s; while length(result)<len do result := result + padchar; end; Gruss |
Re: Problem mit HexToDez
Danke. Es war ein einfacher Denkfehler von mir: Ich dachte, dass bei (selbst wenn das evtl. nicht möglich wäre) z.B. 90h am Ende auch die 0 fehlen würde und dort ein andere Fehler auftreten würde. Wenn man dann aber nachrechnet: 9*16 + 0*1 kommt mit oder ohne 0*1 144 raus und es hat sich nichts geändert. :oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 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