![]() |
Bin2Hex - Probleme
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:
In Realität kommen aber lauter falsche Werte raus (jedes mal dasselbe, hex2bin schneidet String nicht ab)
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; |
Re: Bin2Hex - Probleme
Hallo Michael,
Zitat:
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 |
Re: Bin2Hex - Probleme
Das wäre die Optimierung, aber ich wäre auch schon glücklich wenn es überhaupt funktioniert...
|
Re: Bin2Hex - Probleme
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:
Grüße vom marabu
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; EDIT: Sorry - die Schleife muss natürlich bei size terminieren. |
Re: Bin2Hex - Probleme
* einbau *
-> Fehler:
Delphi-Quellcode:
müsste heissen
for i := 1 to Length(hex) do
Delphi-Quellcode:
aber irgendwie wills trotzedm noch nicht klappen :wall:
for i := 1 to Length(hex) div 2 do
Delphi-Quellcode:
==> '^Š1r~v1z„1~v…yp„?' :gruebel: is irgendwie nicht das Ergebniss...
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); //edit: wenn ich normale Ansistrings (<>string[x]) verwende, krieg ich eine AV :wall: |
Re: Bin2Hex - Probleme
Zitat:
Gut. In bin2hex allerdings nicht mehr :wink:
Code:
So funktioniert es perfekt.
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); |
Re: Bin2Hex - Probleme
muss ich dann für real-Variablen etc. eine 2. Funktion schreiben?
Bei reals geht's auchnicht :wall: 123.456 -> 1,93844495467899E84 |
Re: Bin2Hex - Probleme
:gruebel: 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.
|
Re: Bin2Hex - Probleme
achso, jetzt verstehe ich :oops:
Und stimmt die erste Funktion (bin2hex)? //edit: JUPPIE JUCHUUU!!!! (funzt) //edit2: Vieeelen Dank an alle :thumb: :thumb: :thumb: (brauch ich nämlich bis morgen, 3x dürft ihr raten wofür :xmas: ) |
Re: Bin2Hex - Probleme
Du könntest höchstens noch
Delphi-Quellcode:
durch
result:=result+hexes[1+(bytes[i] div 16)];
result:=result+hexes[1+(bytes[i] mod 16)];
Delphi-Quellcode:
ersetzen :wink: .
result:=result+hexes[1+(bytes[i] shr 4)];
result:=result+hexes[1+(bytes[i] and $F)]; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 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 by Thomas Breitkreuz