Forum: PC-Programmierung Frage Anfänger C#


von DingDong (Gast)


Lesenswert?

Moin,

ich habe aus dem Forum:

Beitrag "Daten auslesen über serielle Schnittstelle C#"

void serialPort1DataReceived(object sender, System.EventArgs e)
{
byte[] buffer = new byte[this.serialPort1.BytesToRead];
this.serialPort1.Read(buffer, 0, this.serialPort1.BytesToRead);
for (int i = 0; i<buffer.Length; i++)
{
tempstring += (" 0x"+buffer[i].ToString("x2"));  // tempstring
globale Variable
}
}

Meine Frage bezieht sich auf auf die Zeile:

tempstring += (" 0x"+buffer[i].ToString("x2"));

Was wird in dieser Zeile gemacht? ich weiss dass x2 für Hexdezimalzahlen 
steht. Wird der buffer an der stelle i in ein String umgewandelt?

VG

: Verschoben durch Moderator
von Felix A. (madifaxle)


Lesenswert?

buffer[i].ToString tut genau was du sagst. Das ("x2") dürfte das 
Zahlenformat HEX angeben.

Die Zeile hängt also alle empfangenen Bytes als HEX in einem String 
aneinander.
Zu ToString findet man bei MSDN viele Infos und Beispiele.

tempstring muss vor der Schleife aber auf "" gesetzt werden, sonst steht 
da immer mehr im String drin, was vielleicht nicht gewünscht wird.

: Bearbeitet durch User
von guest (Gast)


Lesenswert?

Es wird ein String ausgegeben, der den Inhalt des Buffers als 
Hexadezimalwert repräsentiert.
Der Parameter "x2", welcher der Methode ToString() übergeben wird, 
bedeutet, dass eine auf zwei Stellen formatiert wird.
Beispiel:
byte decByte1 = 5;
byte decByte2 = 200;

String hexVal1 = "0x" + decByte1.ToString("x2"); //ergibt 0x05
String hexVal2 = "0x" + decByte2.ToString("x2"); //ergibt 0xC8

von DingDong (Gast)


Lesenswert?

Wozu wird "ox" dazu addiert?

von Felix A. (madifaxle)


Lesenswert?

Weil du sonst nur 05 und C8 bekommen würdest. Strings werden mit einem + 
aneinander gehängt in C#

: Bearbeitet durch User
von DingDong (Gast)


Lesenswert?

Vielen Dank

von nicht"Gast" (Gast)


Lesenswert?

Fantasievolle Klammersertzung übrigens :)

da äußere Paar kann weg und stört nur den Lesefluss.

Kleiner Tip am Range. Wenn tempString wirklich immmer erweitert werden 
soll. Ist ein StringBuilder die bessere Wahl, weil der String sonst 
immer umkopiert werden muss (speicher neu anfordern und kopieren). Das 
wird ziemlich schnell ziemlich langsam.

von nicht"Gast" (Gast)


Lesenswert?

nicht"Gast" schrieb:
> Fantasievolle Klammersertzung übrigens :)
>
> da äußere Paar kann weg und stört nur den Lesefluss.
>
> Kleiner Tip am Range. Wenn tempString wirklich immmer erweitert werden
> soll. Ist ein StringBuilder die bessere Wahl, weil der String sonst
> immer umkopiert werden muss (speicher neu anfordern und kopieren). Das
> wird ziemlich schnell ziemlich langsam.

Oh je, miese Rechschreibung und Satzzeichen sind auch falsch. Ich bitte 
das zu verzeihen und geh mir mal einen Kaffee holen.

von DingDong (Gast)


Lesenswert?

Eine Frage hätte ich noch. Wenn ich diesen Satz eintippe dann wird 
tempstring rot unterstrichen. muss ich diese vorher initialisieren?
>
> tempstring += (" 0x"+buffer[i].ToString("x2"));
>

von nicht"Gast" (Gast)


Lesenswert?

DingDong schrieb:
> Eine Frage hätte ich noch. Wenn ich diesen Satz eintippe dann wird
> tempstring rot unterstrichen. muss ich diese vorher initialisieren?


Ja natürlich. Der ist sonst null.

Also einfach bei der Deklaration ein  '= ""' anfügen.

string tempstring = "";

von DingDong (Gast)


Lesenswert?

Kann ich auch anstatt

> string tempstring = "";

auch

string tempstring;

schreiben?

von nicht"Gast" (Gast)


Lesenswert?

Nein, dann bleibt tempstring nicht initialisiert und ist null. D.h., 
dass nur der Name exisiert, aber kein Object dahinter steht.

damit kracht es beim ersten '+=' da ja nichts da ist. Wenn du irgend wo 
eine Zuweisung mit '=' hast, dann geht es.

Besser ist es allerdings gleich bei der Deklaration auch eine 
Initialisierung durchzuführen. Das kann die später mal eine nette 
Fehlersuche ersparen und ist auch im nachhinein leichter zu lesen.

von nicht"Gast" (Gast)


Lesenswert?

Ach, ein kleiner Link zum Nachlesen:

http://www.c-howto.de/tutorial-variablen-deklaration.html

ist zwar für C aber das sollte das Grunprinzip von Deklaration und 
Initialisierung gut aufzeigen.

von Karl H. (kbuchegg)


Lesenswert?

nicht"Gast" schrieb:
> Ach, ein kleiner Link zum Nachlesen:
>
> http://www.c-howto.de/tutorial-variablen-deklaration.html
>
> ist zwar für C aber das sollte das Grunprinzip von Deklaration und
> Initialisierung gut aufzeigen.

Vorsicht. Ich finde den Link nicht gut (auch wenn ich die Absicht 
honoriere). In C# ist es essentiell, dass man zwischen Wert-Variablen 
und Referenz-Variablen unterscheidet. Wie du oben ja erwähnt hast, hat 
man in C# bei
1
   string tmp;
nicht automatisch schon ein string Objekt, sondern erst mal nur eine 
Referenz auf ein mögliches String Objekt. Anders als bei
1
   int a;
bei dem die Variable 'a' bereits mit Speicher unterfüttert ist, um darin 
einen int Wert zu speichern.

Das alles ist anders als in C, bei dem bei einem
1
  struct string tmp;
der enstprechende Speicher bereits reserviert wird, um darin ein 'struct 
string' Objekt zu speichern (was immer das dann auch sein soll).

Ich empfehle dem TO sich ein C# Lehrbuch zu besorgen oder zumindest erst 
mal ein paar Tutorials (das können durchaus auch mehrere sein!) 
durchzuarbeiten. Es gibt Dinge, die sind nun mal essentiell wichtig, 
wenn man in die Programmierung einsteigt und ohne die ist eine sinnvolle 
Programmentwicklung nicht möglich. Code von anderen Stellen zu kopieren 
ist eine durchaus legitime Methode um an Wissen zu gelangen, 
funktioniert allerdings erst dann, wenn bereits ein entsprechend 
belastbarer Grundstock an Wissen da ist. Vorher hat das keinen Sinn.

: Bearbeitet durch User
von nicht"Gast" (Gast)


Lesenswert?

Der Link sollte eigentlich nur den Unterschied zwischen Deklaration und 
Initialisation erläutern.

Aber du hast ja Recht. Ich hätte einen raussuchen sollen, der direkt von 
C# handelt. Meistens wird das jedoch in unterschiedlichen Kapiteln 
abgehandelt und ist nicht an einer Stelle verfügbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.