Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Suche String->Hex Funktion (https://www.delphipraxis.net/166950-suche-string-hex-funktion.html)

Jumpy 7. Mär 2012 10:08

Delphi-Version: 2010

Suche String->Hex Funktion
 
Hallo,
suche eine Funktion, die mir einen (wahrsch. Ascii-)String Zeichen für Zeichen in die Entsprechende Hex-Darstellung umwandelt. Gibt es da in Delphi (2010) etwas? StrToHex oder so scheint die Hilfe nicht zu finden.

Mir würde es natürlich schon reichen, wenn es eine Funktion gibt, die einfach nur ein Zeichen in Hex umwandelt, analog wie es z.B. CHR() macht. Über den String iterieren kann ich dann zur Not noch selber.

Möchte halt ungern so eine Funktion selber schreiben, die ja nix anderes macht als die "Übersetzung" des Zeichens in einer Liste nachzugucken oder die aus 256 If-Elsen besteht, wenn es sowas doch bestimmt schon gibt.

mkinzler 7. Mär 2012 10:11

AW: Suche String->Hex Funktion
 
Delphi-Referenz durchsuchenStrToBin()

DeddyH 7. Mär 2012 10:14

AW: Suche String->Hex Funktion
 
Meinst Du so etwas?
Delphi-Quellcode:
Format('%.2x', [Ord('A')])

Bernhard Geyer 7. Mär 2012 10:20

AW: Suche String->Hex Funktion
 
Zitat:

Zitat von DeddyH (Beitrag 1155007)
Meinst Du so etwas?
Delphi-Quellcode:
Format('%.2x', [Ord('A')])

Wenn schon dann %.4x - Unser String ist ja schon seit 4 Versionen standardmäßig Unicode-Fähig :-)

Jumpy 7. Mär 2012 10:26

AW: Suche String->Hex Funktion
 
Danke Deddyh. Mit der Format-Funktion hat das geklappt. Muss zwar nochmal alle exotischen Zeichen ausprobieren, aber es sieht gut aus:

Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
begin
  showmessage(Hex(edCommand.Text));
end;

function TForm2.Hex(s: String): String;
var
  h:String;
  i:integer;
begin
  for i := 1 to Length(s) do
    h:=h+Format('%.2x', [Ord(s[i])]);
  Result:=h;
end;
StrToBin() kannte mein Delphi auch nicht :(

DeddyH 7. Mär 2012 10:34

AW: Suche String->Hex Funktion
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1155009)
Zitat:

Zitat von DeddyH (Beitrag 1155007)
Meinst Du so etwas?
Delphi-Quellcode:
Format('%.2x', [Ord('A')])

Wenn schon dann %.4x - Unser String ist ja schon seit 4 Versionen standardmäßig Unicode-Fähig :-)

So besser?
Delphi-Quellcode:
function StrToHex(const s: string): string;
var
  CharWidth, i: integer;
  FormatStr: string;
begin
  CharWidth := SizeOf(Char) * 2;
  FormatStr := Format('%%.%dx', [CharWidth]);
  for i := 1 to Length(s) do
    Result := Result + Format(FormatStr, [Ord(s[i])]);
end;

himitsu 7. Mär 2012 10:46

AW: Suche String->Hex Funktion
 
Zitat:

Zitat von mkinzler (Beitrag 1155006)

Nicht Delphi-Referenz durchsuchenStrToHex Delphi-Referenz durchsuchenBinToHex?

[edit]
Zitat:

StrToBin() kannte mein Delphi auch nicht
In der OH steht bei dir auch nichts dazu? (nicht daß nicht nur die Unit fehlte)

In den INDY sind auch Klassen dafür enthalten, falls die bei dir installiert sind.

Jumpy 7. Mär 2012 11:02

AW: Suche String->Hex Funktion
 
Die erste Variante mit .2 war schon OK. Ausgangspunkt wird ja wahrsch. ein Ansi-String sein. Daher kann die Gegenseite, der das als Command später geschickt wird, mit "2B3439..." wahrscheinlich mehr anfangen als mit "002B00340039...".

Kleines Rätsel für Gelangweilte: Was wird da wohl verschickt werden?

Und nochmal danke für die Beteiligung.

Neutral General 7. Mär 2012 11:39

AW: Suche String->Hex Funktion
 
IntToHex gibt es um eure Verwirrung mal aufzuheben ;-)

shmia 7. Mär 2012 12:50

AW: Suche String->Hex Funktion
 
Siehe Code-Library: http://www.delphipraxis.net/39740-he...aerstring.html
Diese Funktionen sind viel schneller als das Zeichenweise anhängen wie im Beispiel oben.

Sir Rufo 7. Mär 2012 13:43

AW: Suche String->Hex Funktion
 
@DeddyH

Warum so umständlich?
Delphi-Quellcode:
function StrToHex( const s: string ): string;
var
  i : integer;
begin
  for i := 1 to Length( s ) do
    Result := Result + Format( '%.*x', [SizeOf( Char ) * 2, Ord( s[i] )] );
end;

Coffeecoder 7. Mär 2012 13:48

AW: Suche String->Hex Funktion
 
Zitat:

Zitat von Sir Rufo (Beitrag 1155061)
@DeddyH

Warum so umständlich?
Delphi-Quellcode:
function StrToHex( const s: string ): string;
var
  i : integer;
begin
  Result := ''; // <----
  for i := 1 to Length( s ) do
    Result := Result + Format( '%.*x', [SizeOf( Char ) * 2, Ord( s[i] )] );
end;

Muss nicht noch vorher Result initialisiert werden?

DeddyH 7. Mär 2012 13:53

AW: Suche String->Hex Funktion
 
Bei Strings nicht, aber Du darfst das natürlich tun.

Coffeecoder 7. Mär 2012 13:56

AW: Suche String->Hex Funktion
 
Zitat:

Zitat von DeddyH (Beitrag 1155068)
Bei Strings nicht, aber Du darfst das natürlich tun.

Gut dann packe ich einige Funktionen aus, wo ich das immer gemacht habe ;)

DeddyH 7. Mär 2012 13:57

AW: Suche String->Hex Funktion
 
Lass es doch drin, und wenn es nur dem besseren Verständnis dient ;)

himitsu 7. Mär 2012 14:00

AW: Suche String->Hex Funktion
 
Zu 99% geht es auch ohne Initialisierung, aber darauf verlaß dich besser mal nicht. :roll:

Das Result ist leider ein ganz blöder Sonderfall, denn die automatisch Initialisierung von String, dyn. Array und Interface liegt nicht in der Methode, so wie bei den lokalen Variablen, sondern beim Aufrufer und da gibt es ganz nette Seiteneffekte, welche dafür sorgen, daß das Result nicht mit '' vorbelegt sein könnte.

gammatester 7. Mär 2012 14:13

AW: Suche String->Hex Funktion
 
99% scheint mir eine mutige Schätzung, gerade für Delphi 6, denn
Delphi-Quellcode:
function dummy: string;
begin
  result := result + ' oder so';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  s := '42';
  s := dummy;
  showmessage(s);
end;
zeigt zB zuverlässig '42 oder so' an. Und im Assembler ist nix zu sehen vom Vorherlöschen.

himitsu 7. Mär 2012 14:47

AW: Suche String->Hex Funktion
 
OK, dann maximal 50%?

Mir war das bisher nur in Schleifen aufgefallen.


Aber das Fazit ist ganz einfach.
Result-Variablen müssen/sollten immer initialisiert werden, wenn mit ihnen gerechnet wird.
Also immer dann, wenn das Result, innerhalb der Funktion, ausgewertet und nicht nur stur gesetzt wird.

Mam muß bedenken, daß bei diesen gemanagten Result-Typen vom Compiler eine Prozedur daraus gemacht wird.
Aus
Delphi-Quellcode:
function dummy(i: Integer): string;
wird
Delphi-Quellcode:
procedure dummy(i: Integer; var Result: string);
, was man im Assembler gut erkennen kann.

p80286 7. Mär 2012 14:59

AW: Suche String->Hex Funktion
 
Zitat:

Zitat von shmia (Beitrag 1155051)
Siehe Code-Library: http://www.delphipraxis.net/39740-he...aerstring.html
Diese Funktionen sind viel schneller als das Zeichenweise anhängen wie im Beispiel oben.

Aber obacht, D2010 hat als Standard 16Bit Chars und da könnte es Probleme geben.
(sizeof statt length nutzen?)

Gruß
K-H

DeddyH 7. Mär 2012 15:01

AW: Suche String->Hex Funktion
 
Besser beides: Length * SizeOf(Char)
Nee, Quatsch, es sind ja beides Strings.

Sir Rufo 7. Mär 2012 15:02

AW: Suche String->Hex Funktion
 
Zitat:

Zitat von p80286 (Beitrag 1155113)
Zitat:

Zitat von shmia (Beitrag 1155051)
Siehe Code-Library: http://www.delphipraxis.net/39740-he...aerstring.html
Diese Funktionen sind viel schneller als das Zeichenweise anhängen wie im Beispiel oben.

Aber obacht, D2010 hat als Standard 16Bit Chars und da könnte es Probleme geben.
(sizeof statt length nutzen?)

Gruß
K-H

Du meinst eher
Delphi-Quellcode:
Length( s ) * SizeOf( s[1] ) * 2

p80286 7. Mär 2012 15:26

AW: Suche String->Hex Funktion
 
Wenn ich ehrlich bin ist mir diese "Length(x)*sizeof(x[1])" etwas suspect.
Da bei der Umwandlung irgendwas_Hex immer ein Byte in 2Zeichen umgewandelt wird sollte byteweise gelesen werden und mit char geschrieben werden, also ungefähr so

setlength(dest,sizeof(source)*2);
for i:=1 to sizeof(source) do
dest[i]:=machwas(source[i]);

Gruß
K-H

DeddyH 7. Mär 2012 15:29

AW: Suche String->Hex Funktion
 
Lass Dir mal SizeOf(string) ausgeben.

[edit] Schon selbst gemacht:
Delphi-Quellcode:
var
  s: string;
begin
  s := 'Hallo Welt';
  ShowMessage(Format('%d - %d - %d', [SizeOf(s), Length(s), Length(s) * SizeOf(Char)]));
end;
Ergibt unter XE 4 - 10 - 20, unter Delphi 2007 4 - 10 - 10 [/edit]

p80286 7. Mär 2012 15:35

AW: Suche String->Hex Funktion
 
Zitat:

Zitat von DeddyH (Beitrag 1155135)
Lass Dir mal SizeOf(string) ausgeben.

Delphi-Quellcode:
type
 mystr : string[255];
sizeof(mystr) liefert 256 !

Wenn ich mich richtig erinnere gab es bei Ansi Strings da auch eine Möglichkeit.
und um die 16Bitter kümmer ich mich wenn's notwendig wird.

Aber ist schon recht, man muß wissen was man da anstellt, und nicht ungeprüft übernehmen was man irgendwo liest.

Gruß
K-H

DeddyH 7. Mär 2012 15:38

AW: Suche String->Hex Funktion
 
ShortStrings und Strings (also AnsiString oder UnicodeString, je nach Version) sind ja 2 vollkommen verschiedene Paar Schuhe.

Bummi 7. Mär 2012 15:39

AW: Suche String->Hex Funktion
 
ich vermute es war folgendes gemeint
Delphi-Quellcode:
var
 s:String;
begin
 s := 'Nasenbär';
 Showmessage(IntToStr(SizeOf(s)));
end;

DeddyH 7. Mär 2012 15:39

AW: Suche String->Hex Funktion
 
Japp, siehe mein Edit in #23.

himitsu 7. Mär 2012 15:43

AW: Suche String->Hex Funktion
 
Delphi-Quellcode:
var
  S: String;

Label1.Caption := Format('%s %s', [SizeOf(Char), SizeOf(S[1]), StringElementSize(S)]);
:stupid:

Bummi 7. Mär 2012 15:46

AW: Suche String->Hex Funktion
 
'%d %d %d'

DeddyH 7. Mär 2012 15:47

AW: Suche String->Hex Funktion
 
Und mein Delphi 2007 kennt kein StringElementSize.

himitsu 7. Mär 2012 16:06

AW: Suche String->Hex Funktion
 
StringElementSize wurde eingeführt, als in D2009 der UnicodeString eingeführt und der AnsiString verändert/erweitert wurde.


Delphi-Quellcode:
function StringElementSize(const S: String): Word; // String = AnsiString, UnicodeString oder WideString
function StringCodePage(const S: String): Word;
function StringRefCount(const S: String): Integer;

procedure SetCodePage(var S: RawByteString; CodePage: Word; Convert: Boolean = True);

procedure SetAnsiString(Dest: PAnsiString; Source: PWideChar; Length: Integer; CodePage: Word);

procedure SetMultiByteConversionCodePage(CodePage: Integer); // ändert die Standardcodepage für einfache AnsiStrings

function UnicodeFromLocaleChars(CodePage, Flags: Cardinal; LocaleStr: PAnsiChar;
  LocaleStrLen: Integer; UnicodeStr: PWideChar; UnicodeStrLen: Integer): Integer; overload;
function LocaleCharsFromUnicode(CodePage, Flags: Cardinal;
  UnicodeStr: PWideChar; UnicodeStrLen: Integer; LocaleStr: PAnsiChar;
  LocaleStrLen: Integer; DefaultChar: PAnsiChar; UsedDefaultChar: PLongBool): Integer; overload;


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