AGB  ·  Datenschutz  ·  Impressum  







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

String Konvertierung

Ein Thema von zeras · begonnen am 25. Feb 2018 · letzter Beitrag vom 28. Feb 2018
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.382 Beiträge
 
Delphi 12 Athens
 
#1

AW: String Konvertierung

  Alt 25. Feb 2018, 12:30
Ähhhhhhhhh .... Text und StrToInt?

Wie wäre es mit HexToBin oder einer gleichwertigen Stream-Funktion
und dann Delphi-Referenz durchsuchenTEncoding.Unicode.Xyz, bzw. Delphi-Referenz durchsuchenTEncoding.BigEndianUnicode ? (Bytefolge beachten)

Wobei letzter Teil notfalls "einfach" entfallen kann, wenn man es direkt in einen Delphi-Referenz durchsuchenUnicodeString schreibt. (hier muß man aber vermutlich noch die Bytes der Chars umdrehen, vonwegen BigEndian)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Feb 2018 um 13:45 Uhr) Grund: HexToBin ... nicht HexToStr
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: String Konvertierung

  Alt 25. Feb 2018, 13:32
Ähhhhhhhhh .... Text und StrToInt?

Wie wäre es mit HexToStr oder einer gleichwertigen Stream-Funktion
und dann Delphi-Referenz durchsuchenTEncoding.Unicode.Xyz, bzw. Delphi-Referenz durchsuchenTEncoding.BigEndianUnicode ? (Bytefolge beachten)

Wobei letzter Teil notfalls "einfach" entfallen kann, wenn man es direkt in einen Delphi-Referenz durchsuchenUnicodeString schreibt. (hier muß man aber vermutlich noch die Bytes der Chars umdrehen, vonwegen BigEndian)
Tja und das alles in D6 ? LOL
Denke das gab es da noch nicht.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.382 Beiträge
 
Delphi 12 Athens
 
#3

AW: String Konvertierung

  Alt 25. Feb 2018, 13:43
Delphi-Referenz durchsuchenHexToBin gab es bestimmt schon
und den Delphi-Referenz durchsuchenWideString auch.

http://docwiki.embarcadero.com/RADSt...rsion_routines
http://docwiki.embarcadero.com/RADSt...pes#WideString


In einem neueren Delphi würde ich gleich bei Unicode bleiben.
Wenn in einem älteren Delphi (D2007 und davor) eh nur ANSI angezeigt wird, also nicht das Delphi z.B. mit Unicode-Controls aufgerüstet wurde,
dann kann man da auch direkt MSDN-Library durchsuchenWideCharToMultiByte / MSDN-Library durchsuchenMultiByteToWideChar (für UnicodeBE > UnicodeLE > ANSI oder UnicodeLE > ANSI oder nur UnicodeBE > UnicodeLE) nutzen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#4

AW: String Konvertierung

  Alt 25. Feb 2018, 19:25
Hmm..

Ich sehe in der Verwendung von HexToBin zu StrToInt keinen Vorteil..

HexToBin füllt (zumindestens in D6) einen PChar und dieser ist in D6 Ansi.
Und ich mag das harte Speichergecaste nach dem Prinzip PChar(WideChar) nicht.
Zusätzlich muss ich dafür sorgen, dass der Text auch nur Kleinbuchstaben enthält, was bei dem XML-Auszug nicht der Fall ist.

Mit der Methode WideChar(StrToInt( )) könnte ich auch statt des Edits (unter D6 nur ANSI) ein WideString füllen..

Wie ich ja auch schrieb
Kleiner Test mit D6...
War es nur ein Test, welcher funktionierte..
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.382 Beiträge
 
Delphi 12 Athens
 
#5

AW: String Konvertierung

  Alt 25. Feb 2018, 20:44
Ich sehe in der Verwendung von HexToBin zu StrToInt keinen Vorteil..

HexToBin füllt (zumindestens in D6) einen PChar und dieser ist in D6 Ansi.
HexToBin macht mehrere/alle Bytes auf einmal
und IntToStr nur jeweils ein Char.

Und das ANSI/Unicode ist hier vollkommen egal, denn das PChar ist im Eingang und nicht im Ausgang, also der hexadezimale String (quelle) ist ANSI und das passt genau zu allen Text-Ladefunktionen des jeweiligen Delphi (ANSI und Unicode).
Der Ausgang ist aber Binär und da im Einganz 4 Zeichen = 2 Byte = WideChar ... passt das direkt in einen WideString/UnicodeString.

Falls Big/Little-Endian nicht passt, dann am Ende nochmal schnell Delphi-Referenz durchsuchenSwapByte über jedes Char jagen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: String Konvertierung

  Alt 25. Feb 2018, 20:59
Am ende führen viele Wege nach ROM..
Wie man eine Aufgabe löst kann doch egal sein solange sie zum gleichen Ergebnis führt.

just my 2 Cent.

Aber es würde mich schon interessieren wie du das umsetzen würdest..
Quelltext ?

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.382 Beiträge
 
Delphi 12 Athens
 
#7

AW: String Konvertierung

  Alt 25. Feb 2018, 23:29
Zitat:
Aber es würde mich schon interessieren wie du das umsetzen würdest..
So schwer zwei/drei genannte Befehle in einen Code zu schreiben und die Parameter zu füllen?
Delphi-Quellcode:
var
  S: string;
  B: TBytes;
  U: UnicodeString; //WideString
  i: Integer;
begin
  S := '0056006F007200730063006800610075';
  SetLength(B, Length(S) div 2);
  HexToBin(PChar(S), B[0], Length(B));
  S := TEncoding.BigEndianUnicode.GetString(B);
  ShowMessage(S);

  S := '0056006F007200730063006800610075';
  SetLength(U, Length(S) div 4);
  HexToBin(PChar(S), U[Low(U)], Length(U) * 2);
  for i := High(U) downto Low(U) do
    Word(U[i]) := Swap(Word(U[i]));
  ShowMessage(U);

Zitat:
Delphi-Quellcode:
  Edit2.Text := '';
  For i := 0 to (length(Edit1.Text) div 4)-1 do begin
    Edit2.Text := Edit2.Text + WideChar(StrToInt('$' + Copy(Edit1.Text,1 + (i*4),4)));
PS: Vom Speichermanagement her sind die vielen Stringoperationen ein Graus, vor allem im alten Delphi-Memory-Manager.
Massenhaft Speicher reservieren und wieder freigeben ... 4 Mal pro Char, zuzüglich nochmal der Behandlungen im EDIT.
Dank FastMM mag sich da seit Delphi 6 so Einiges gebessert haben, aber schön ist es dennoch nicht.

Gut, bei diesem einen String, innerhalb eines Button-OnClick, mag es niemand wirklich bemerken.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Feb 2018 um 01:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.382 Beiträge
 
Delphi 12 Athens
 
#8

AW: String Konvertierung

  Alt 28. Feb 2018, 13:37
Aber es würde mich schon interessieren wie du das umsetzen würdest..
Quelltext ?
Nja, wenn ich mal schnell Code ohne Delphi zusammentippe, dann kann es passieren, dass er nicht kompiliert und schon beschwert sich jemand.
Und die selben Befehle kann man in tausenden Varianten aufrufen -> jeder hat sein eigenes Codedesign, je nach Compiler/Delphiversion gibt es auch noch kleine Unterschiede und der Eine nutzt lieber diese Methode und ein Anderer was Anderes.

Der Hauptunterschied ist einfach, dass nicht jedes Char einzeln übersetzt und dafür jeweils mehrfach der Speichermanager behelligt wird, sondern dass alle Chars gemeinsam behandelt werden.
Selbst die kleine Schleife bezüglich der Bytedrehung (BigEndian>LittleEndian) könnte man noch durch einen Befehl ersetzen, welcher UnicodeBE nach UnicodeLE umwandelt. (z.B. MSDN-Library durchsuchenMultiByteToWideChar mit Codepage 1201 zu 1200 inplace, also direkt die Ausgabe in den Eingabestring)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#9

AW: String Konvertierung

  Alt 26. Feb 2018, 17:40
Hmm..

[QUOTE=himitsu;1394623]
Und das ANSI/Unicode ist hier vollkommen egal, denn das PChar ist im Eingang und nicht im Ausgang, also der hexadezimale String (quelle) ist ANSI und das passt genau zu allen Text-Ladefunktionen des jeweiligen Delphi (ANSI und Unicode).
Unter D6 sieht HexToBin so aus :
Delphi-Quellcode:
function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer; assembler;
const
  Convert: array['0'..'f'] of SmallInt =
    ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15);
var
  I: Integer;
begin
  I := BufSize;
  while I > 0 do
  begin
    if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break;
    Buffer[0] := Char((Convert[Text[0]] shl 4) + Convert[Text[1]]);
    Inc(Buffer);
    Inc(Text, 2);
    Dec(I);
  end;
  Result := BufSize - I;
end;[DELPHI]
[/DELPHI]

Hier ist Buffer ein PChar und in diesen wird ein Char 'geschrieben', somit Out....

das 'S := '0056006F007200730063006800610075';' würde unter D6 nicht funktionieren, da hier nur Kleinbuchstaben zulässig sind, jedoch im Musterstring diese Großbuchstaben sind..

Wenn dies in einer späteren Delphiversion geändert worden ist, OK.. Ich hab hier im Moment nur in D6.

Unter D6 ist auch TBytes und PChar nicht kompatible..
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: String Konvertierung

  Alt 27. Feb 2018, 07:49
Hier ist Buffer ein PChar und in diesen wird ein Char 'geschrieben', somit Out....

das 'S := '0056006F007200730063006800610075';' würde unter D6 nicht funktionieren, da hier nur Kleinbuchstaben zulässig sind, jedoch im Musterstring diese Großbuchstaben sind..

Wenn dies in einer späteren Delphiversion geändert worden ist, OK.. Ich hab hier im Moment nur in D6.

Unter D6 ist auch TBytes und PChar nicht kompatible..
Wo ein Wille, da ist auch ein Weg.
Das funktioniert auch unter D6. Beachte den aufrufenden Code in der procedure Main.
Entspricht den angepassten Beispiel von Himi:

Delphi-Quellcode:
program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils;

// Von HolgerXs Delphi 6
function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer; assembler;
const
  Convert: array['0'..'f'] of SmallInt =
    ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15);
var
  I: Integer;
begin
  I := BufSize;
  while I > 0 do
  begin
    if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break;
    Buffer[0] := Char((Convert[Text[0]] shl 4) + Convert[Text[1]]);
    Inc(Buffer);
    Inc(Text, 2);
    Dec(I);
  end;
  Result := BufSize - I;
end;

procedure Main;
var
  S: string;
  B: string;
begin
  S := '0056006F007200730063006800610075';
  S := LowerCase(S);
  SetLength(B, Length(S) div 2);
  HexToBin(PChar(S), @B[1], Length(B));
  S := StringReplace(B, #0, '', [rfReplaceAll, rfIgnoreCase]);
  Writeln(S);
end;

begin
  try
    Main;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:57 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-2025 by Thomas Breitkreuz