![]() |
ANSI-Hex-String ---> Ansi-String
Es geibt einen String z.b. '4450' und rauskommen soll 'DP' :angel2:
Meine Routine geht, aber das muß doch auch noch viel einfacher gehen oder?
Delphi-Quellcode:
Bye
Const HexDig: Array[ 0..15 ] Of Char = ( '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ); Function HexStringToString( Const Input: String ): String; Var s: String; i, j: Integer; va, vu: Integer; c: Char; Begin va := 0; vu := 0; Result := ''; s := UpperCase( Input ); For i := 1 To Length( s ) Do Begin c := s[ i ]; For j := 0 To 15 Do If HexDig[j] = c Then vu := j; If Not( ( i mod 2 ) = 0 ) Then Begin va := ( vu Shl 4 ); End Else Begin va := va + ( vu ); Result := Result + Chr( va ); End; End; End; |
Re: ANSI-Hex-String ---> Ansi-String
Ok noch ne Möglichkeit:
Delphi-Quellcode:
Gibts noch was besseres?
Const cHexDig: Set Of Char = [ 'A', 'a', 'B', 'b', 'C', 'c',
'D', 'd', 'E', 'e', 'F', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]; Function CheckHexChar( Input: Char ): Char; Begin Result := Input; If Not( Input In cHexDig ) Then Raise Exception.Create( 'Char is not a HexChar' ); End; Function HexStringToString( Const Input: String ): String; Var i, Start: Integer; Begin Try If Not( Length( Input ) Mod 2 = 0 ) Then Begin Start := 2; Result := Chr( StrToInt( '$' + CheckHexChar( Input[ 1 ] ) ) ); End Else Begin Start := 1; Result := ''; End; For i := Start To ( Length( Input ) ) Do Begin If ( ( Start = 1 ) And ( Not( i Mod 2 = 0 ) ) ) Then Begin Result := Result+ Chr( StrToInt( '$' + CheckHexChar( Input[ i ] ) + CheckHexChar( Input[ i + 1 ] ) ) ); End Else If ( ( Start = 2 ) And ( i Mod 2 = 0 ) ) Then Begin Result := Result+ Chr( StrToInt( '$' + CheckHexChar( Input[ i ] ) + CheckHexChar( Input[ i + 1 ] ) ) ); End; End; Except On Error: Exception Do Begin Error.Message := 'HexStringToString - Error:'#13#10 + Error.Message; Raise; End; End; End; Bye |
Re: ANSI-Hex-String ---> Ansi-String
Hallo,
Das hier würde ich als besser bezeichnen:
Delphi-Quellcode:
grüße, daniel
function HexStrToStr ( s:string ) : string;
var k,len : integer; hexw : array[0..10] of char; binw : array[0..10] of char; begin len := length ( s ) div 2; setlength(Result, len); for k := 1 to len do begin hexw[0] := s[k*2-1]; hexw[1] := s[k*2]; hexw[3] := #0; HexToBin ( hexw, binw, 10 ); Result[k] := char(binw[0]); end; end; [EDIT]Schöner formatiert[/EDIT] |
Re: ANSI-Hex-String ---> Ansi-String
So geht es auch, aber dahintergestiegen bin ich noch nicht :zwinker:
Bye |
Re: ANSI-Hex-String ---> Ansi-String
Na dann versuch ichs mal mit Erklärung :-D
Delphi-Quellcode:
Ich hoffe, dass ist jetzt deutlicher
function HexStrToStr ( s:string ) : string;
var k,len : integer; hexw : array[0..10] of char; binw : array[0..10] of char; begin len := length ( s ) div 2; //Der Ergebnisstring ist halb so lang, wie s. Ist wohl klar setlength(Result, len); for k := 1 to len do begin //immer 2 Char aus s holen hexw[0] := s[k*2-1]; hexw[1] := s[k*2]; //Mit binärer 0 abschließen hexw[3] := #0; //Text in Binärwert umwandeln z.B. aus 'FF' wird jetzt #FF HexToBin ( hexw, binw, 10 ); //Binärwert als Charakter casten und in Ergebnisstring schreiben. Result[k] := char(binw[0]); end; end; :mrgreen: |
Re: ANSI-Hex-String ---> Ansi-String
Was hällts du davon?
Delphi-Quellcode:
Function HexStrToStr( Input: String ): String;
Var i: Integer; Ch: Char; HexW: Array[ 0..1 ] Of Char; Begin Result := ''; For i := 1 To ( Length( Input ) Div 2 ) Do Begin HexW[ 0 ] := Input[ i * 2 - 1 ]; HexW[ 1 ] := Input[ i * 2 ]; HexToBin ( Hexw, @Ch, 2 ); Result := Result + Ch; End; End; bye Edit: Besser? |
Re: ANSI-Hex-String ---> Ansi-String
Teilweise. Du solltest die Länge von Result schon im vorhinein setzen und dann per Idx auf die Zeichen zugreifen. Sonst erzeugst du bei jedem Schleifendurchlauf einen neuen String im Speicher.
|
Re: ANSI-Hex-String ---> Ansi-String
hmm wird das Zeichen nicht nur rangehangen? :gruebel:
Bye |
Re: ANSI-Hex-String ---> Ansi-String
Nein, es wird immer ein neuer erzeugt.
Das ist so ähnlich wie bei dynamischen Arrays. Wenn du in einer Schleife immer setlength(Array, AlteLänge + 1) sagst, wird immer ein neuer, größerer Speicherblock angefordert und die alten Daten dort rein kopiert. Wenn möglich sollte bei solchen Sachen die Größe schon vorher angegeben werden. |
Re: ANSI-Hex-String ---> Ansi-String
Thx for info :thumb:
Bye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 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