Entwickler-Ecke

Basistechnologien - Unicode-Problem mit ASCII "F1"


OlafSt - Mo 10.11.14 21:26
Titel: Unicode-Problem mit ASCII "F1"
Hallo Freunde,

seit zwei Stunden bastel ich an einem typischen Unicode-Problem herum, finde aber keine Lösung.

Ich muß Daten an eine kleine Settop-Box senden (UDP). Die Daten sind durchgehend normale ASCII-Texte, erfordern aber einen spezifischen Header. Dieser Header enthält das ASCII-Zeichen "\xF1" - und dieses macht mich langsam wahnsinnig.

Ich dachte mir in meiner Naivität:

C#-Quelltext
1:
2:
3:
4:
s = "\x41\xF1"+textBox1.Text; //textBox1.Text enthält einfach mal "123"
ASCIIEncoding ae = new ASCIIEncoding();
byte[] b = ae.GetBytes(s);
client.Send(b, b.Getlength(0));


Das Ergebnis in b[] müsste sein: 0x41 0xF1 0x31 0x32 0x33.
Ist es nicht, sondern 0x41 0x3F 0x31 0x32 0x33.

Ist irgendwie logisch, mein \xF1-Zeichen wird ein Unicodezeichen und ASCIIEncoding tut sein bestes - aber falsches. Ich habe auch schon

C#-Quelltext
1:
s="\x41F1"+textBox1.Text;                    

versucht, ohne Erfolg.

Wie mache ich es richtig ?


Ralf Jansen - Mo 10.11.14 22:06

Es sind bytes also warum da erst Text draus machen?


C#-Quelltext
1:
2:
3:
var preamble = new byte[] { 0x410xF1 };
var bytes = preamble.Concat(Encoding.ASCII.GetBytes(textBox1.Text)).ToArray();            
client.Send(bytes, bytes.Count);


OlafSt - Mo 10.11.14 22:09

Wald -> Bäume.

ich stecke echt noch zu tief in den Delphi-Methodiken drin, fürchte ich. Wieder was gelernt, danke !


jaenicke - Mo 10.11.14 23:37

user profile iconOlafSt hat folgendes geschrieben Zum zitierten Posting springen:
ich stecke echt noch zu tief in den Delphi-Methodiken drin, fürchte ich.
Da hätte man das aber sauber auch nicht anders gemacht. ;-)
Das ganze Gebastel mit AnsiStrings als Containern für Daten für serielle Ports usw. hat prozentual vermutlich einen hohen Anteil der Probleme bei der Umstellung auf Delphi mit Unicode verursacht...


OlafSt - Di 11.11.14 10:39

Stimme ich vorbehaltlos zu.

Allerdings: Was wäre denn die Alternative gewesen ? So coole Konstrukte wie List<byte> gibts noch nicht allzu lange - besonders, wenn man bedenkt, wie lange man schon serielle Geräte mit dem PC ansteuern kann. Wenn man solche Kommandoketten Stück für Stück zusammenbauen muß, schreits geradezu nach Strings, denn nix anderes läßt sich so einfach in der Größe erweitern wie die Dinger (oder war ein superpraktischer Buffer mit 255 Bytes Größe) ;)