AGB  ·  Datenschutz  ·  Impressum  







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

Bin2Hex - Probleme

Ein Thema von ichbins · begonnen am 22. Dez 2005 · letzter Beitrag vom 25. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#1

Bin2Hex - Probleme

  Alt 22. Dez 2005, 19:59
Hallo, ich habe folgende Bin2Hex-Funktion geschrieben, aber die scheint nicht ganz zu funktionieren. Könnt ihr mir sagen was dabei der Fehler ist?

Hinweis: Aus z.B. i:integer=511 soll s:string='000001FF' werden.

Die Hex2Bin-Funktion schneidet vom zu lesenden String die gelesenen Bytes ab.

Delphi-Quellcode:
const
  hexes:string='0123456789ABCDEF';

function mybin2hex(const data;size:integer):string;
var
  bytes:array of byte;
  i:integer;
begin
  setlength(bytes,size);
  fillchar(bytes[0],length(bytes),#0);
  copymemory(@bytes[0],@data,size);
  result:='';
  for i:=0 to length(bytes)-1 do begin
    result:=result+hexes[1+(bytes[i] div 16)];
    result:=result+hexes[1+(bytes[i] mod 16)];
  end;
  setlength(bytes,0);
end;

//Ermitteln welchen Index der Char im String hat. (C in '0123456789ABCDEF' => 12)
function indexof(s:string;c:char):integer;
var
  i:integer;
begin
  result:=0;
  for i:=1 to length(s) do
    if s[i]=c then
    begin
      result:=i;
      exit;
    end;
end;

procedure myhex2bin(var data; hex:string; const size:integer);
var
  bytes:array of byte;
  i:integer;
  workwith:string;
begin
  workwith:=copy(hex,1,size*2);
  hex:=copy(hex,size*2,length(hex)-size*2);
  setlength(bytes,length(workwith) div 2);
  for i:=0 to (length(workwith) div 2)-1 do
    bytes[i]:=indexof(hexes,workwith[i*2])*16+indexof(hexes,workwith[i*2+1]);
  copymemory(@data,@bytes,length(bytes));
  setlength(bytes,0);
end;
In Realität kommen aber lauter falsche Werte raus (jedes mal dasselbe, hex2bin schneidet String nicht ab)
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Bin2Hex - Probleme

  Alt 22. Dez 2005, 22:13
Hallo Michael,

Zitat von ichbins:
Die Hex2Bin-Funktion schneidet vom zu lesenden String die gelesenen Bytes ab.
Wo macht sie das denn? Kennst du den Unterschied von call-by-value und call-by-reference?

Du kannst deine Konstante HEXES ruhig aus den Prozeduren heraus nehmen - eine Konstante reicht für beide Prozeduren. Und wenn du dich ein wenig anstrengst, dann kommst du auch ohne zusätzliche lokale Variablen (bytes, workwith) aus. Deine Funktion IndexOf ist viel zu teuer für ihren Zweck - mach es besser inline. Vielleicht schaffst du es auch die mehrfache Berechnung des selben Wertes (Length(worklist) div 2) zu vermeiden.

Grüße vom marabu
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Bin2Hex - Probleme

  Alt 23. Dez 2005, 13:42
Das wäre die Optimierung, aber ich wäre auch schon glücklich wenn es überhaupt funktioniert...
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Bin2Hex - Probleme

  Alt 23. Dez 2005, 14:19
Hallo Michael,

meinen wichtigsten Hinweis hast du einfach überlesen - call by reference ist notwendig, wenn du abschneiden willst. Beachte das var Schlüsselwort in der Signatur. Die lokalen Zwischenspeicher habe ich eliminiert und die nibble Berechnung als inline code aufgenommen.

Delphi-Quellcode:
const
  HEX_DIGITS: string = '123456789ABCDEF0';

procedure myhex2bin(var data; var hex: string; const size: integer);
var
  bin: PByte;
  i: integer;
begin
  bin := @data;
  for i := 1 to size do // Length(hex) durch size ersetzt
  begin
    bin^ := (Pos(hex[Pred(i shl 1)], HEX_DIGITS) mod 16) shl 4
          + (Pos(hex[i shl 1], HEX_DIGITS) mod 16);
    Inc(bin);
  end;
  Delete(hex, 1, size shl 1);
end;
Grüße vom marabu


EDIT: Sorry - die Schleife muss natürlich bei size terminieren.
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Bin2Hex - Probleme

  Alt 23. Dez 2005, 14:54
* einbau *

-> Fehler:

for i := 1 to Length(hex) do müsste heissen
for i := 1 to Length(hex) div 2 do aber irgendwie wills trotzedm noch nicht klappen
Delphi-Quellcode:
var
  s,s2:string[255];
  x:string;
begin
  s:='My name is methos.';
  x:=mybin2hex(s,255);
  myhex2bin(s2,x,255);
  showmessage('Myhex2bin(mybin2hex(''My name is methos'')) = '+s2);
==> '^Š1r~v1z„1~v…yp„?' is irgendwie nicht das Ergebniss...

//edit: wenn ich normale Ansistrings (<>string[x]) verwende, krieg ich eine AV
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: Bin2Hex - Probleme

  Alt 23. Dez 2005, 15:12
Zitat:
Code:
result:=result+hexes[[b]1+[/b](bytes[i] mod 16)];
Hier hast du berücksichtigt, dass Delphi-Strings 1-indiziert sind.
Gut.
In bin2hex allerdings nicht mehr
Code:
bin^ := ((Pos(hex[Pred(i shl 1)], hexes) mod 16) [b]- 1[/b]) shl 4
          + ((Pos(hex[i shl 1], hexes) [b]- 1[/b]) mod 16);
So funktioniert es perfekt.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Bin2Hex - Probleme

  Alt 23. Dez 2005, 15:15
muss ich dann für real-Variablen etc. eine 2. Funktion schreiben?

Bei reals geht's auchnicht

123.456 -> 1,93844495467899E84
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Bin2Hex - Probleme

  Alt 23. Dez 2005, 15:25
Nein. Es geht doch nicht um den Argumenttyp, sondern um deine Konstante, die eben ein Delphi-String ist. Wenn im Hexstring beispielsweise '0' steht, gibt Pos 1 zurück und so steht es dann auch in data.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Bin2Hex - Probleme

  Alt 23. Dez 2005, 15:26
achso, jetzt verstehe ich

Und stimmt die erste Funktion (bin2hex)?

//edit: JUPPIE JUCHUUU!!!! (funzt)

//edit2: Vieeelen Dank an alle (brauch ich nämlich bis morgen, 3x dürft ihr raten wofür )
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#10

Re: Bin2Hex - Probleme

  Alt 23. Dez 2005, 15:35
Du könntest höchstens noch
Delphi-Quellcode:
result:=result+hexes[1+(bytes[i] div 16)];
result:=result+hexes[1+(bytes[i] mod 16)];
durch
Delphi-Quellcode:
result:=result+hexes[1+(bytes[i] shr 4)];
result:=result+hexes[1+(bytes[i] and $F)];
ersetzen .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:13 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