AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Den Ordinal Wert eines Elements im Set ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Den Ordinal Wert eines Elements im Set ermitteln

Ein Thema von Kostas · begonnen am 20. Mai 2015 · letzter Beitrag vom 21. Mai 2015
Antwort Antwort
Seite 1 von 2  1 2      
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Den Ordinal Wert eines Elements im Set ermitteln

  Alt 20. Mai 2015, 18:00
Delphi-Version: 5
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 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
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Den Ordinal Wert eines Elements im Set ermitteln

  Alt 20. Mai 2015, 18:39
Der Ordinalwert ist in dem Fall Byte(Msg[i])
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Den Ordinal Wert eines Elements im Set ermitteln

  Alt 20. Mai 2015, 18:40
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.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Den Ordinal Wert eines Elements im Set ermitteln

  Alt 20. Mai 2015, 19:04
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;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Den Ordinal Wert eines Elements im Set ermitteln

  Alt 20. Mai 2015, 21:17
Na ja, er arbeitet mit Byte, so wie der Code aussieht.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Den Ordinal Wert eines Elements im Set ermitteln

  Alt 20. Mai 2015, 23:37
Der Ordinalwert ist in dem Fall Byte(Msg[i])
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;
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

AW: Den Ordinal Wert eines Elements im Set ermitteln

  Alt 20. Mai 2015, 23:54
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.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Den Ordinal Wert eines Elements im Set ermitteln

  Alt 21. Mai 2015, 00:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Den Ordinal Wert eines Elements im Set ermitteln

  Alt 21. Mai 2015, 00:30
Wenn ich mir diese Übersetzungs-Liste anschaue, dann bekommst du eine Bytefolge der einen String in den Codepage 850 beinhaltet.

Warum also dieser Aufwand?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

AW: Den Ordinal Wert eines Elements im Set ermitteln

  Alt 21. Mai 2015, 09:22
....und mich erinnert die Problematik etwas an diesen Thread:

Schnellstes entfernen ...

weil: was für Entfernen schnell ist, ist auch für Ersetzen gut
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:38 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