2016-06-30 5 views
0

Ich sende eine C-Struktur mit Schreiben an einen Server. Die Struktur und das Schreiben sehen so aus.Unbekanntes Byte in C write struct

typedef struct MyStruct { 
    uint8_t   flag; 
    char   str[50]; 
    int32_t   number; 
    time_t   time; 

} MyStruct ; 

... 

// Create mystruct 

memset(&mystruct->flag, '\1', sizeof(uint8_t)); 
memset(&mystruct->str, '\0', sizeof(char) * 50); 
memset(&mystruct->number, '\2', sizeof(int32_t)); 
memset(&mystruct->time, '\3', sizeof(time_t)); 

write(sockfd, mystruct, sizeof(MyStruct)); 

Der Server, in Java, erhält die Informationen in einem nio ByteBuffer und bekommt dann ein byte[] mit ByteBuffer.array. Als ich die byte[] seinen Inhalt untersuchen sind:

[ 0]   = 1 
[ 1] to [50] = 0 
[51]   = 70 
[52] to [55] = 2 
[56] to [63] = 3 

Wenn Sie die Längen aufsummieren 1 + 50 + 4 + 8 Sie 63, aber die Länge mit den ungeraden 70 Byte ist 64.

Warum ist die 70 Byte hier? Hat es etwas mit Netzwerken oder Strukturen zu tun? Wie auch, wenn ich kann, loswerden?

+3

Bitte tun Sie das einfach nicht. Du verlangst eine Welt des Schmerzes. Wenn Sie einen Kanal verwenden, der Byteströme sendet, definieren Sie genau, wie viel Bytes Sie austauschen werden. Sage nicht: "Ich werde senden, was auch immer die C struct ist und hoffe, dass es auf der anderen Seite Sinn macht." –

+0

Haben Sie bemerkt, dass 'memset (& mystruct-> number, '\ 2', sizeof (int32_t));' die Variable auf '0x02020202' oder dezimal' 33686018' setzt? –

+0

@ WeatherVane ja, das ist nur ich es zu debuggen. – ezPaint

Antwort

2

Warum sind die 70 Byte hier? Hat es etwas mit Vernetzung oder c-Strukturen zu tun? Wie auch, wenn ich kann, loswerden?

Wahrscheinlich hat es mit Struktur padding zu tun. Sie können versuchen, jedes Mitglied der Struktur separat zu serialisieren, wenn dies der Fall ist.

Auch here ist eine Stelle, die gut alle Tücke mit Serialisierung in C. erklärt

Serialisierung in C komplizierter ist als in C# sagen oder ich denke, auch in Java, zum Beispiel in C# wissen Sie, dass ganze Zahl ist immer 4 Bytes groß, was in C nicht der Fall ist, wo die Größe von Integer auf Plattformen variieren kann.

+0

Also durch serialisieren, in C, sollte ich eine Methode machen, die ein Byte-Array erstellt, wie ich es möchte? – ezPaint

+0

@ezPaint Ja, überprüfen Sie den Link in meiner Antwort –

+0

@ezPaint Es gibt auch smt wie Pragma-Paket - aber oft wird davon abgeraten –

2

Es ist fast sicher aufgrund der Struktur Polsterung; Höchstwahrscheinlich erfordert Ihr Compiler/Prozessor 32-Bit-Werte, um 32-Bit ausgerichtet zu sein, so dass, da Ihre uint8_t und Ihre char[50] bis zu 51 Bytes addieren, es ein Ein-Byte-Pad zwischen str und number gibt.

Wie in den Kommentaren erwähnt - Sie möchten wirklich Ihre Serialisierung explizit behandeln. Es gibt eine Reihe von Bibliotheken, die Java und C/C++ - Typen definieren können, sowie Methoden zum Serialisieren/Deserialisieren in jeder Sprache.