struct -> byte array -> TCP -> string leer

03/03/2016 22:25 Nanoxx™#1
Hey,

ich schreibe ein mehr oder weniger kleines Programm, welches Informationen über einen TCP Socket senden soll (struct).

mein struct:

PHP Code:
public struct DATA
{
public 
Int32 ID;
public 
byte[] Test;
public 
string Name;

Client:

PHP Code:
public void Client()
{
//Asnyc TCP Socket....
Socket _SOCKET;

DATA Daten = new DATA()

Daten.ID 1;
DATEN.Name "Nanoxx";
byte[] buffer Convert.ConvertToByte(Daten);
_SOCKET.Send(buffer);

Server:

PHP Code:
public void Server()
{
//Asnyc TCP Socket....
Socket _SOCKET;

byte[] buffer empfangeneDaten;

DATA Daten = new DATA();
Daten Convert.ToStruct<DATA>(buffer);

Console.WriteLine(Daten.ID); // Gibt 1 aus
Console.WriteLine(Daten.name); // Gibt nichts aus ("") -> Lenght = 0

Converter->


Habe schon verschiedene Sachen getestet aber nichts funktioniert...
03/04/2016 14:11 qqdev#2
Schonmal debuggt? Was steht im buffer?
03/04/2016 14:19 Nanoxx™#3
Ok habs... alles was im struct unter "public byte[] Test;" steht geht verloren.... :|
03/04/2016 20:28 Fx.Duke#4
Daten.Test = new byte[0];
03/14/2016 12:57 0ptimist#5
Quote:
Originally Posted by Nanoxx™ View Post
Ok habs... alles was im struct unter "public byte[] Test;" steht geht verloren.... :|
Klar, deine Converterfunktion berücksichtigt diesen Teil der Daten nicht.

Wenn hinter der Referenz tatsächlich ein Array steckt hast du doch mindestens zwei Speicherblöcke. Ich sehe bis jetzt nicht wo ConvertToByte dies berücksichtigen würde.
03/14/2016 19:20 Logtetsch#6
Code:
var[] array = Encoding.ASCII.GetBytes(daten);
03/21/2016 08:35 Xio.#7
Struct's kannst du nur mit fester groesse in ein byte array kopieren.

string und byte[] sind dynamisch.

So handhabe ich es:

PHP Code:
    [StructLayout(LayoutKind.SequentialPack 1)]
    public 
unsafe struct MsgFriendInfo
    
{
        public 
ushort Size;
        public 
ushort Id;
        public 
uint UniqId;
        public 
uint Look;
        public 
byte Level;
        public 
byte Profession;
        public 
ushort PkPoints;
        public 
ushort GuildUID;
        public 
byte Unknow;
        public 
byte Position;
        public 
fixed byte Spouse [16];

        public static 
byte[] Create(Player target)
        {
            var 
packet = new MsgFriendInfo {Size 36Id 2033UniqId target.UniqueIdLook = (uint)target.LookLevel target.LevelProfession target.Class, PkPoints target.PkPointsGuildUID = (ushort)target.Guild.UniqueIdUnknow 0Position = (byte)target.GuildRank,};
            for (
byte i 0target.Partner.Lengthi++)
                
packet.Spouse[i] = (byte)target.Partner[i];
            return 
packet;
        }

        public static 
implicit operator byte[](MsgFriendInfo msg)
        {
            var 
buffer BufferPool.GetBigBuffer();
            
fixed (bytebuffer)
                *(
MsgFriendInfo*)= *&msg;
            return 
buffer;
        }
    } 
Spouse ist ein string der maximal 16 zeichen lang ist.