Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit HexToDez (https://www.delphipraxis.net/84567-problem-mit-hextodez.html)

Nils_13 18. Jan 2007 15:59


Problem mit HexToDez
 
Hi,

ich muss Hex nach Dez umwandeln und habe diese Funktion dafür:
Delphi-Quellcode:
function TfrmMain.HexToDez(s : String) : Integer;
var c : Integer;
    l : Integer;
begin
  Val(s, l, c);
  Result := l;
end;
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:
9C
wird zu:
9$C

Delphi-Quellcode:
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;
Ich steh gerade total auf dem Schlauch....

sirius 18. Jan 2007 16:09

Re: Problem mit HexToDez
 
wir wärs damit:
Delphi-Quellcode:
function TfrmMain.HexToDez(s : String) : Integer;
var c : Integer;
    l : Integer;
begin
  Val('$'+s, l, c);
  Result := l;
end;
Edit: Ah, ich verstehe dein Problem.

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.

Nils_13 18. Jan 2007 16:12

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.

3_of_8 18. Jan 2007 16:14

Re: Problem mit HexToDez
 
Wo ist das Problem?

Nils_13 18. Jan 2007 16:19

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.

sirius 18. Jan 2007 16:22

Re: Problem mit HexToDez
 
Zitat:

Zitat von Nils_13
@sirius:
Dein Code müsste laut deinem Edit dann doch funktionieren. Er liefert bei 9C aber 0 zurück.

funktioniert bei mir einwandfrei:

Delphi-Quellcode:
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;
-->156

Nils_13 18. Jan 2007 16:23

Re: Problem mit HexToDez
 
Sry, hatte da irgendwo einen Fehler drinnen, behoben. Thx.

Christian Seehase 18. Jan 2007 18:10

Re: Problem mit HexToDez
 
Moin Nils,

warum nimmst Du nicht

Delphi-Quellcode:
StrToInt
:gruebel:

Nils_13 18. Jan 2007 18:25

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.

Christian Seehase 18. Jan 2007 19:01

Re: Problem mit HexToDez
 
Moin Nils,

ja und?
Dann ruf es doch in Deiner Funktion HexToDez auf ;-)

Nils_13 19. Jan 2007 19:27

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:
function TfrmMain.HexToDez(s : String) : Integer;
var c : Integer;
    l : Integer;
begin
  Val('$'+s, l, c);
  Result := l;
end;
Der Aufruf von HexToDez sieht so aus:
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;

thkerkmann 19. Jan 2007 20:08

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

Nils_13 19. Jan 2007 20:18

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.

Hawkeye219 19. Jan 2007 20:29

Re: Problem mit HexToDez
 
Hallo Nils,

die Funktion HexToDez ist fehlertoleranter als du denkst. Versuche es mal mit diesem Aufruf:

Delphi-Quellcode:
if (Copy(line, j, 4) = 'int ') then
  begin
    asd := HexToDez(Copy(line, 5, MaxInt));
    A.Lines[i] := IntToStr(asd);
  end;
Gruß Hawkeye

Nils_13 19. Jan 2007 20:33

Re: Problem mit HexToDez
 
Danke, es funktioniert endlich :)

Nils_13 20. Jan 2007 16:02

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:
 
function TfrmMain.HexToDez(s : String) : Integer;
var c : Integer;
    l : Integer;
begin
  Val('$'+s, l, c);
  Result := l;
end;
Das sollte dann endlich mein letztes Problem mit dieser Funktion gewesen sein :).

Christian Seehase 20. Jan 2007 16:06

Re: Problem mit HexToDez
 
Moin Nils,

Zitat:

Ich habe jetzt das Problem, dass mir die obengenannte Funktion 09 (Hex) in 9 (Dez) verwandelt. Wie kann man das verhinden ?
Wozu, ist doch korrekt... :gruebel:

Nils_13 20. Jan 2007 16:08

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

phXql 20. Jan 2007 16:21

Re: Problem mit HexToDez
 
Zitat:

Zitat von Nils_13
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

Schreibst du die 1 auch als 000001?? Links stehende Nullen werden normalerweise weggelassen...

Nils_13 20. Jan 2007 16:32

Re: Problem mit HexToDez
 
Du hast es nicht verstanden: das ist 8-bit, nicht 4-Bit.

thkerkmann 20. Jan 2007 16:51

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:

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;
Vielleicht hilft dir das.

Gruss

Nils_13 20. Jan 2007 17:20

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