Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ANSI-Hex-String ---> Ansi-String (https://www.delphipraxis.net/38572-ansi-hex-string-ansi-string.html)

Kedariodakon 21. Jan 2005 09:25


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:
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;
Bye

Kedariodakon 21. Jan 2005 10:03

Re: ANSI-Hex-String ---> Ansi-String
 
Ok noch ne Möglichkeit:

Delphi-Quellcode:
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;
Gibts noch was besseres?

Bye

Sanchez 21. Jan 2005 10:55

Re: ANSI-Hex-String ---> Ansi-String
 
Hallo,

Das hier würde ich als besser bezeichnen:
Delphi-Quellcode:
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;
grüße, daniel

[EDIT]Schöner formatiert[/EDIT]

Kedariodakon 21. Jan 2005 11:28

Re: ANSI-Hex-String ---> Ansi-String
 
So geht es auch, aber dahintergestiegen bin ich noch nicht :zwinker:

Bye

Sanchez 21. Jan 2005 11:47

Re: ANSI-Hex-String ---> Ansi-String
 
Na dann versuch ichs mal mit Erklärung :-D

Delphi-Quellcode:
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;
Ich hoffe, dass ist jetzt deutlicher
:mrgreen:

Kedariodakon 21. Jan 2005 11:51

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?

Sanchez 21. Jan 2005 12:28

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.

Kedariodakon 21. Jan 2005 12:31

Re: ANSI-Hex-String ---> Ansi-String
 
hmm wird das Zeichen nicht nur rangehangen? :gruebel:


Bye

Sanchez 21. Jan 2005 12:39

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.

Kedariodakon 21. Jan 2005 12:45

Re: ANSI-Hex-String ---> Ansi-String
 
Thx for info :thumb:

Bye


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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