Entwickler-Ecke

Basistechnologien - Eingaben binär anzeigen, geht das auch einfacher?


avoid - Do 25.07.13 23:38
Titel: Eingaben binär anzeigen, geht das auch einfacher?
Ich möchte eingaben binär angezeigt bekommen.
Das habe ich mit folgendem Code hin bekommen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for (int i = 0; i < textBox.TextLength; i++)
{
    string text = textBox.Text.Substring(i, 1);
    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    byte[] bytewertarray = enc.GetBytes(text);
    string bitstring = Convert.ToString(bytewertarray[0], 2).PadLeft(8'0');
    textBox_bit.AppendText(bitstring);
}

ich durchlaufe also alle eingegebenen zeichen, wobei jedes erst in ASCII und dann weiter zu binär umgewandelt und danach wieder ausgegeben wird.

doch es geht sicher eleganter, einfacher oder nicht? wenn ja wie?

Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet.


Delete - Fr 26.07.13 05:47

- Nachträglich durch die Entwickler-Ecke gelöscht -


avoid - Fr 26.07.13 13:14

wie ich sehe verwendest du ".ToCharArray()" das spart dir das Encoding zu ASCII und .GetBytes().
um zwei schritte vereinfacht, nice, danke. :)


Delete - Fr 26.07.13 13:30

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Fr 26.07.13 13:47

Zitat:
wie ich sehe verwendest du ".ToCharArray()" das spart dir das Encoding zu ASCII und .GetBytes().


Dafür bekommst du jetzt als Ergebnis ja auch eine utf16 Lösung und keine ASCII. Probier mal z.B. das € Zeichen und vergleiche beide Methoden.
Falls ASCII Encoding relevant ist mußt du auch explizt so encoden bzw. explizit knallen wenn der Input nicht in ASCII darstellbar ist.


Th69 - Fr 26.07.13 14:14

Hallo zusammen,

aber warum erst ein char-Array erzeugen?

C#-Quelltext
1:
2:
3:
4:
foreach (char c in s)
{
  ...
}

Ein char ist ein char, egal ob in einem string oder einem char[].

P.S. Auch das PadLeft(8, ...) macht mich stutzig, denn ein char [http://msdn.microsoft.com/de-de/library/vstudio/x9h8tsay.aspx] ist intern ein 16bit-Wert.
Bei Convert.ToString(c, 2) findet nämlich eine Promotion auf int statt, und es wird die Methode Convert.ToString(int value, int toBase) [http://msdn.microsoft.com/en-us/library/b1kwkfdz.aspx] aufgerufen (schaut mal die Ausgabe bei den "Examples" an).


avoid - Fr 26.07.13 15:29

@Ralf Jansen,
UTF16 hab ich im Encoding nicht drin aber mit utf32 kommt das selbe Resultat wie bei ASCII raus.
dann sehe ich das "a" 01100001 ist, also die 97 in der ASCII-Tabelle.

ob es relevant ist kann ich dir gar nicht beantworten.
aber es sollen auch so dinge wie Leertaste und alle anderen Sonderzeichen verarbeitet werden.
selbst Enter (CR LF) macht es so aktuell, was ich recht nett finde.

@Th69,
du hast mit dem char schon recht.
wenn ich aber diese Zeile verwende muss ich ein Array benutzen wegen der Syntax.

C#-Quelltext
1:
byte[] bytewert = enc.GetBytes(text);                    

das hat Frühlingsrolle ja nur von mir übernommen.

die Sache mit .PadLeft(8, ...) ist schon richtig so denke ich.
die Bits fangen ja von rechts an weswegen mich die linken 8 nicht kümmern.
ich gehe von einer normalen ASCII-Tabelle mit den werten 000 bis 255 aus.
sollte ich auch mal die anderen verwenden kann ich die 8 ja auf 16 aufstocken.
und die ersten 8Bit sind ja schließlich die einzig wahren. ;)

das mit der Promotion auf int verstehe ich aber nicht. :(


Ralf Jansen - Fr 26.07.13 15:40

Zitat:
das mit der Promotion auf int verstehe ich aber nicht. :(


Du hast einen char und die Convert.ToString() Methode die du aufruft hat keine Überladung mit char. Die die am nächsten dran ist ist die mit int also wird der char nach int gecastet. Und der cast Operator char -> int wird dir die utf16 Repräsentation als int liefern. Für die üblichen Zeichen(in deutsch und englisch) ist das Bytemuster in den verschiedenen Encodings oft gleich aber eben nicht alle. Darum mein Hinweis auf das "€" Zeichen als Beispiel.

Wenn du sagst du möchtest die binär Darstellung eines char dann must du sagen in welchem Encoding. Ein char hat keinen eindeutige binär Representation. Ein char ist ein char ist ein char (user profile iconTh69 siehste da kann ich drüber ;)) und kein Byte oder Bytefolge.


Delete - Sa 27.07.13 22:21

- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - So 28.07.13 09:13

Hallo,

du weißt aber schon, wofür '00111111' im ASCII-Code [http://de.wikipedia.org/wiki/ASCII] steht, oder? (Tipp: dies entspricht decimal 63)
Und daher ist ASCIIEncoding nur bedingt einsetzbar (und außerdem kann man sich auch die Schleife über das byte-Array sparen, denn ASCII codiert immer nur genau 1 Byte)...

@avoid, @Frühlingsrolle: lest euch daher mal unter ASCIIEncoding [http://msdn.microsoft.com/de-de/library/system.text.asciiencoding.aspx] den Abschnitt 'Remarks' genau durch.

P.S: @Ralf, das mit dem "char ist ein char ist ein char" wollte ich sogar erst schreiben, dachte mir aber, das versteht dann keiner :lol:


avoid - So 28.07.13 15:08

Th69, sprichst du auf diesen abschnitt an?
Zitat:
Beim Codieren werden Unicode-Zeichen in eine Bytefolge transformiert. Beim Decodieren wird eine Folge codierter Bytes in Unicode-Zeichen transformiert.

ASCIIEncoding entspricht der Windows-Codepage 20127. Da ASCII eine 7-Bit-Codierung ist, sind ASCII-Zeichen auf die niedrigsten 128 Unicode-Zeichen beschränkt, von U+0000 bis U+007F. Wenn Sie den von der Encoding.ASCII-Eigenschaft oder dem ASCIIEncoding-Konstruktor zurückgegebenen Standardencoder verwenden, werden Zeichen außerhalb dieses Bereichs durch ein Fragezeichen (?) ersetzt, bevor der Codierungsvorgang ausgeführt wird. Da die ASCIIEncoding-Klasse nur einen beschränkten Zeichensatz unterstützt, sind die Klassen UTF8Encoding, UnicodeEncoding und UTF32Encoding für globalisierte Anwendungen besser geeignet. Die folgenden Überlegungen unterstützen Sie bei der Entscheidung, ob ASCIIEncoding verwendet werden soll:

falls ja, warum sagst du das nicht einfach so: "bei ASCIIEncoding werden nur die ersten Zeichen mit 7 Bit (0-127) verwendet, alle Zeichen die darüber liegen werden durch ein ? ersetzt und können nicht verarbeitet werden".

so verstehe ich es auch. ;)

dem nach kann ich alle gängigen Zeichen der deutschen Sprache verwenden ausgenommen § und ´ womit ich kein Problem habe.
ich tüftele ja nur an einem kleinen Rätzel spiel.


Ralf Jansen - So 28.07.13 15:57

Zitat:
dem nach kann ich alle gängigen Zeichen der deutschen Sprache verwenden ausgenommen § und ´ womit ich kein Problem habe.


ä,ö,ü,ß,€ sind natürlich völlig unüblich in Deutsch ;)


avoid - So 28.07.13 17:00

stimmt, die liegen ja auch dahinter.
hab ich vor lauter merkwürdigen schnörkeln gar nicht in der Tabelle bemerkt.


Delete - So 28.07.13 23:01

- Nachträglich durch die Entwickler-Ecke gelöscht -