GLBasic forum

Other languages => GLBasic - de => Topic started by: mangoo on 2010-Oct-15

Title: Netzwerk/Datentypen Frage
Post by: mangoo on 2010-Oct-15
Hallo,

habe jetzt erst seit einigen Tagen glbasic und bin bisher super zufrieden.
Vorher hab ich lange Zeit mit C# programmiert und bin auf glbasic wegen Iphone und Windows Mobile Support gekommen.

Bisher komm ich auch gut klar, jetzt hab ich allerdings eine Frage:

Ich habe in C# einen TCP/IP Server programmiert, die Übertragung erfolgt byte basiert und pro Nachricht schicke ich immer die Länge der Nachricht als Integer, mit einem Byte Array als Daten

int length;
byte[] data;

in diesem byte[] sind jetzt verschiedene Datentypen, wie unsigned int, long, short, byte ........

Das auslesen erfolgt dann so in C#

Code (glbasic) Select
       
protected override bool deserialize()
        {
            PlayerIndex = BinaryReader.ReadByte();
            Time = BinaryReader.ReadInt32();
            Actions = BinaryReader.ReadInt16();
            return true;
        }



Mein Problem ist jetzt, ich weiss nicht wie ich das hier einfach in glbasic umsetzen kann.
Ich hab in den Forenbeiträgen gelesen, dass man einen String mit SOCK_RECV bekommt, dieser aber zum Glück einfach nur ein byte array ist. Soweit so gut, damit komm ich klar.

Jetzt muss ich allerdings in glbasic die entsprechenden byte arrays auswerten und aufstückeln.

Für File auslesen gibt es ja was tolles:

READBYTE, READLONG .......

Aber eben nur für File Operation oder lieg ich da falsch?

Genauso muss ich auch meine Werte wieder in den Socket schreiben.

WRITEBYTE ......


Wie mach ich das jetzt hier am schlausten? Muss ich dafür Inline C Code verwenden?
Ich will vermeiden die Nachricht in eine temporäre Datei zu schreiben und diese dann mit den bequemen READ Funktionen auszulesen bzw zu beschreiben, das wäre doch ein bisschne unprofessionell und langsam :-)


Kann mir da wer helfen?
Title: Re: Netzwerk/Datentypen Frage
Post by: Kitty Hello on 2010-Oct-18
Ist nicht so geplant.
Du kannst mit SOCK_RECV aber ein Byte-Feld lesen und dann mit INLINE die Bytes zusammenschneiden und in Dein TYPE übertragen.

Code (glbasic) Select

LOCAL ixd%, time%, act%
SOCK_RECV(... msg$, 12)
INLINE
const char* pC = msg_Str.c_str();
ixd = *((int*)pC); pC +=4; // 4 Byte weiter schieben
time=*(int*)pC); pC+=4;
act=*(short*)pC;
ENDINLINE

Title: Re: Netzwerk/Datentypen Frage
Post by: mangoo on 2010-Oct-29
Ok klasse, das mach ich dann so.

Wie ist das denn mit dem Typ int in c++,  sind das immer 4 Bytes?
Auf Iphone, Windows Mobile ....

Wenn nein, wie kann ich das sicherstellen?
Title: Re: Netzwerk/Datentypen Frage
Post by: Kitty Hello on 2010-Nov-10
oh. Auf mehreren Platformen müsstest Du auch noch big/little endian beachten usw. :S