Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Den Ordinal Wert eines Elements im Set ermitteln (https://www.delphipraxis.net/185183-den-ordinal-wert-eines-elements-im-set-ermitteln.html)

Kostas 20. Mai 2015 17:00

Delphi-Version: 5

Den Ordinal Wert eines Elements im Set ermitteln
 
Hallo Zusammen,

ich habe eine Liste an Bytes in einem Set angelegt "SpecialCharacterBytesSet".
Jedes Byte repräsentiert ein Zeichen aus dem Array "SpecialCharacters" Beides wird als synchron gehalten.


Über die Abfrage
Delphi-Quellcode:
if (Byte(Msg[i]) in SpecialCharacterBytesSet) then
kann ich ermitteln ob das Byte welche ich untersuche im Set vorkommt. Jetzt würde ich gerne den Ordinalwert
des gefundenen Bytes ermitteln, denn dieser repräsentiert das Zeichen aus dem Array of AnsiChar.

Ich such also eine Möglichkeit ohne jedes mal das Array durchlaufen zu müssen und es muss leider auch
Delphi5 (nicht XE5)kompatibel sein.



Delphi-Quellcode:
type TByteSet = set of Byte;

const SpecialCharacters: array [0 .. 13] of AnsiChar = '[\]{|}~ÄÖÜäöüß';

var
  SpecialCharacterBytesSet: TByteSet;
begin
  SpecialCharacterBytesSet := [$5B, $5C, $5D, $7B, $7C, $7D, $7E, $8E, $99, $9A, $84, $94, $81, $E1];


  if (Byte(Msg[i]) in SpecialCharacterBytesSet) then
...
Hat jemand eine Idee?

Gruß Kostas

BUG 20. Mai 2015 17:39

AW: Den Ordinal Wert eines Elements im Set ermitteln
 
Der Ordinalwert ist in dem Fall
Delphi-Quellcode:
Byte(Msg[i])
:gruebel:

Dejan Vu 20. Mai 2015 17:40

AW: Den Ordinal Wert eines Elements im Set ermitteln
 
Ich versteh die Frage nicht. Aber rein präventiv: Verwende doch einfach ein Array[Byte] of boolean. Für alle Sonderzeichen ist der entsprechende Eintrag True, ansonsten nicht. Dann kannst du direkt abfragen, ohne durchsuchen des Arrays.

Bjoerk 20. Mai 2015 18:04

AW: Den Ordinal Wert eines Elements im Set ermitteln
 
Oder als array[Char] of boolean?

Delphi-Quellcode:
var
  C: char;
  SpecialCharacters: array[Char] of boolean;
begin
  FillChar(SpecialCharacters[#0], Length(SpecialCharacters) * SizeOf(SpecialCharacters[#0]), 0);
  SpecialCharacters['ß'] := true;
  for C := Low(Char) to High(Char) do
    if SpecialCharacters[C] then ShowMessage(Format('%s is a SpecialCharacter', [C]));
end;

Dejan Vu 20. Mai 2015 20:17

AW: Den Ordinal Wert eines Elements im Set ermitteln
 
Na ja, er arbeitet mit Byte, so wie der Code aussieht.

Kostas 20. Mai 2015 22:37

AW: Den Ordinal Wert eines Elements im Set ermitteln
 
Zitat:

Zitat von BUG (Beitrag 1302358)
Der Ordinalwert ist in dem Fall
Delphi-Quellcode:
Byte(Msg[i])
:gruebel:

Sorry für die schlechte Beschreibung.
Msg ist ein langer String mit Bytes die über eine TCP Kommunikation kommen.
Dieser String enthält Steuerzeichen und Klartext als Bytes. Ich durchlaufe den kompletten
String und ignoriere alle Steuerzeichen und wandle die einzelne Byte in Char um. Die besagten
Special characters sind nicht in der CodePage wo sie eigentlich sein sollen.
Das 'ü' ist also nicht auf $FC sondern auf $81 alle andere Zeichen bis auf die Special characters
sind am richtigen Platz.
Aktuell hab ich zwei Arrays eines Array of Byte mit den 13 Byte werten und eines Array of AnsiChar
Ich durchlaufe für jedes Byte(Msg[i]) das komplette Array of Byte und wenn das Byte vorkommt habe ich den
Index für das zwei Array of AnsiChar und hole mir einfach das Char heraus.

Das wollte ich verbessern. Die Absicht ist, das Array of Byte mit den 13 Einträgen nicht für jedes Byte(Msg[i]) durchlaufen zu müssen.


Jetzt habe ich eine Lösung gefunden. Muss ich morgen noch genau testen.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type TSpecialCharacters = array[Byte] of AnsiChar;
var SpecialCharacters:TSpecialCharacters;
begin
 SpecialCharacters[$5B] := '[';
 SpecialCharacters[$5C] := '\';
 SpecialCharacters[$5D] := ']';
 SpecialCharacters[$7B] := '{';
 SpecialCharacters[$7C] := '|';
 SpecialCharacters[$7D] := '}';
 SpecialCharacters[$7E] := '~';
 SpecialCharacters[$8E] := 'Ä';
 SpecialCharacters[$99] := 'Ö';
 SpecialCharacters[$9A] := 'Ü';
 SpecialCharacters[$84] := 'ä';
 SpecialCharacters[$94] := 'ö';
 SpecialCharacters[$81] := 'ü';
 SpecialCharacters[$E1] := 'ß';

 Label1.caption := SpecialCharacters[$5B];
 Label2.caption := SpecialCharacters[$5C];

end;

BUG 20. Mai 2015 22:54

AW: Den Ordinal Wert eines Elements im Set ermitteln
 
Zitat:

Zitat von Kostas (Beitrag 1302388)
Jetzt habe ich eine Lösung gefunden. Muss ich morgen noch genau testen.

Das sieht doch nach einem guten Ansatz aus.
An deiner Stelle würde ich alle Einträge in dem Array füllen, die zu ignorierenden Sonderzeichen mit null und die gleichbleibenden Zeichen mit dem entsprechendem Zeichen. Dann brauchst du nach dem Nachschlagen nur noch die Nullwerte verwerfen.

Kostas 20. Mai 2015 23:12

AW: Den Ordinal Wert eines Elements im Set ermitteln
 
Das Problem ist, die Daten erzeugt eine externe Hardware. Der Hersteller konnte mir die Frage welche
CodePage verwendet wird nicht beantworten. Auch eine Erklärung warum die Umlaute und ein paar weitere Zeichen nicht nach ASCII ausgegeben werden sondern aus einer Umsetzungstabelle zu holen sind, hatte er nicht.

Somit bleibt mir nichts anderes als alle Zeichen versuchen als Char auszugeben und nur die Special characters
umzubiegen. Das System ist halt Historisch über die Jahre gewachsen und so richtig den Durchblick hat keiner,
incl. mich. :-)

Was mich allerdings wundert ist, das Array SpecialCharacters konnte ich per SetLength(SpecialCharacters,13)
setzen. Die Values konnte ich jedoch setzen. Eigentlich hätte ich erwartet dass es Knallt.

Herzlichen Dank für die Hilfe nochmals. Das Thema ist erst einmal vom Tisch.

Gruß Kostas

Sir Rufo 20. Mai 2015 23:30

AW: Den Ordinal Wert eines Elements im Set ermitteln
 
Wenn ich mir diese Übersetzungs-Liste anschaue, dann bekommst du eine Bytefolge der einen String in den Codepage 850 beinhaltet.

Warum also dieser Aufwand?

mm1256 21. Mai 2015 08:22

AW: Den Ordinal Wert eines Elements im Set ermitteln
 
....und mich erinnert die Problematik etwas an diesen Thread:

Schnellstes entfernen ...

weil: was für Entfernen schnell ist, ist auch für Ersetzen gut :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.
Seite 1 von 2  1 2      

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