Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

1

15.10.2012, 15:14

C# Stream Write/Read int

Hey,
ich bin seit geraumer Zeit an einem merkwürdigen Problem. Ich konnte es soweit eingrenzen, dass ich rausfinden konnte, dass es mit dem Stream zusammen hängt.
Und zwar schreibe ich einen Int-Wert in einen Stream und möchte diesen hinterher wieder herauslesen. Dabei erhalte ich einen völlig anderen Wert.
Code zum schreiben ist:

C#-Quelltext

1
2
3
4
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms);
sw.Write(13);
sw.Flush();


Code zum lesen ist:

C#-Quelltext

1
2
byte[] b = new byte[4];
ms.Read(b, 0, 4);


Wenn ich nun über BitConverter.ToInt32(b,0) den Int-Wert aus dem Buffer holen möchte, bekomme ich 0 zurück gegeben. Ich habe vorher schon recht viele andere Dinge probiert und das ist jetzt so der letzte Versuch gewesen.

Die Sache ist, dass ich für eine Netzwerkanwendung Daten in den Stream schreiben möchte, daraus ein Byte Array generiere, diese sende und auf der anderen Seite wieder auslese. Für einfaches zusammensetzen der Nachrichten wollte ich gerne Streams verwenden, aber wie gesagt die arbeiten grad nicht so wie ich das eigentlich möchte;)
So langsam weiß ich auch nicht mehr was ich testen sollte. An sich sollte es aber eine recht einfache Sache sein und ich bin mir sicher, dass ich grad einfach irgendetwas übersehe.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

15.10.2012, 15:26

Ich konvertiere vorm Schreiben den Int immer erst in einen Byte-Array ...
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

15.10.2012, 15:41

Wäre dann folgendes:

C#-Quelltext

1
sw.Write(BitConverter.GetBytes(13));

Das Problem bleibt das selbe. Ausgabe ist weiterhin 0.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

4

15.10.2012, 16:04

Ich denke, das Problem ist, dass "StreamWriter" nicht das ist, was du möchtest. Du willst eigentlich einen "BinaryWriter".
Wenn du direkt auf den Stream zugreifst und dir den "StreamWriter" sparst, geht es auch:
ms.Write(BitConverter.GetBytes(13), 0, 4);

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

15.10.2012, 16:10

C#-Quelltext

1
2
3
4
5
6
MemoryStream ms = new MemoryStream();
ms.Write(BitConverter.GetBytes(13), 0, 4);
byte[] b2 = new byte[4];
ms.Read(b2, 0, 4);
Console.WriteLine("b2.length: " + b2.Length);
Console.WriteLine("b2: " + BitConverter.ToInt32(b2, 0));

Liefert:

Quellcode

1
2
b2.length: 4
b2: 0

Scheint auch nicht zu laufen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

15.10.2012, 16:22

C#-Quelltext

1
2
3
4
5
6
BinaryWriter bw;
BinaryReader br;

bw.Write(13);

int _13 = br.ReadInt32();

Da braucht's keinerlei merkwürdigen Konverter oder sonstiges. Wenn das nicht geht, dann ist Deine unterliegende Stream-Klasse "defekt" oder Du öffnest sie verkehrt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

7

15.10.2012, 16:50

@Schorsch
Du musst natürlich die Position zurücksetzen. ;)
ms.Position = 0;

Sonst liest du ja am leeren Ende aus.

@BlueCobold
Hab ich ihm auch als Möglichkeit genannt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

15.10.2012, 16:54

Jup, habe ich gesehen. Wollte es trotzdem nochmal konkret posten.

Es fehlt bei ihm in der Tat ein Seek, das hatte ich übersehen. Ein Stream ist schließlich kein Stack ;) Ist jetzt die Frage, was er eigentlich will, einen Stream oder einen Stack? :D
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

15.10.2012, 17:25

Jau seek war das Stichwort;) Benutze ich nun und ebenfalls verwende ich BinaryReader und BinaryWriter. Damit gehts ohne Probleme. Hätte ich selber sehen sollen. Danke euch;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige