![]() |
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:
kann ich ermitteln ob das Byte welche ich untersuche im Set vorkommt. Jetzt würde ich gerne den Ordinalwert
if (Byte(Msg[i]) in SpecialCharacterBytesSet) then
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:
Hat jemand eine Idee?
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 ... Gruß Kostas |
AW: Den Ordinal Wert eines Elements im Set ermitteln
Der Ordinalwert ist in dem Fall
Delphi-Quellcode:
:gruebel:
Byte(Msg[i])
|
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.
|
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; |
AW: Den Ordinal Wert eines Elements im Set ermitteln
Na ja, er arbeitet mit Byte, so wie der Code aussieht.
|
AW: Den Ordinal Wert eines Elements im Set ermitteln
Zitat:
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; |
AW: Den Ordinal Wert eines Elements im Set ermitteln
Zitat:
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. |
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 |
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? |
AW: Den Ordinal Wert eines Elements im Set ermitteln
....und mich erinnert die Problematik etwas an diesen Thread:
![]() weil: was für Entfernen schnell ist, ist auch für Ersetzen gut :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 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 by Thomas Breitkreuz