Erste Gehversuche erfolgreich...
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
const double mantisseFaktor = (1 << 30);
void detectType(int Type);
void getInt(unsigned char *Buffer);
void getBool(unsigned char *Buffer);
void getString(unsigned char *Buffer);
void getDouble(unsigned char *Buffer);
void getArray(unsigned char *Buffer);
void getStruct(unsigned char *Buffer);
unsigned char buffer[] = {0X42,0X69,0X6e,0X00,0X00,0X00,0X00,0Xf8,0X00,0X00,0X00,0X10,0X73,0X79,0X73,0X74,0X65,0X6d,0X2e,0X6d,0X75,0X6c,0X74,0X69,0X63,0X61,0X6c,0X6c,0X00,0X00,0X00,0X01,0X00,0X00,0X01, 0X00,0X00,0X00,0X00,0X02,0X00,0X00,0X01,0X01,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X0a,0X6d,0X65,0X74,0X68,0X6f,0X64,0X4e,0X61,0X6d,0X65,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X05, 0X65,0X76,0X65,0X6e,0X74,0X00,0X00,0X00,0X06,0X70,0X61,0X72,0X61,0X6d,0X73,0X00,0X00,0X01,0X00,0X00,0X00,0X00,0X04,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X04,0X43,0X55,0X78,0X44, 0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X0c,0X43,0X55,0X58,0X32,0X38,0X30,0X31,0X30,0X30,0X31,0X3a,0X31,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X08,0X43,0X4d,0X44,0X5f,0X52,0X55,0X4e, 0X4c,0X00,0X00,0X00,0X02,0X01,0X00,0X00,0X01,0X01,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X0a,0X6d,0X65,0X74,0X68,0X6f,0X64,0X4e,0X61,0X6d,0X65,0X00,0X00,0X00,0X03,0X00,0X00,0X00, 0X05,0X65,0X76,0X65,0X6e,0X74,0X00,0X00,0X00,0X06,0X70,0X61,0X72,0X61,0X6d,0X73,0X00,0X00,0X01,0X00,0X00,0X00,0X00,0X04,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X04,0X43,0X55,0X78, 0X44,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X0c,0X43,0X55,0X58,0X32,0X38,0X30,0X31,0X30,0X30,0X31,0X3a,0X31,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X08,0X43,0X4d,0X44,0X5f,0X52,0X45, 0X54,0X4c,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X01,0X30};
unsigned int BufferPosition = 0;
unsigned int byteShift = 4;
unsigned char byte4[4];
int ebene = 0;
int main(int argc, char *argv[]) {
int dataLength = 0;
int dataType = 0;
int dataCount = 0;
int msgType = 0;
int msgLength = 0;
char *msgString;
int i;
// Header Auslesen
byteShift = 4;
memcpy(byte4, &buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
dataType = 0 + byte4[3];
printf("Art: %s\n", (dataType==1)?"Response":"Request");
// Datenlänge ermitteln
byteShift = 4;
memcpy(byte4, &buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
dataLength = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
printf("Datenlaenge: %d Byte\n", dataLength);
switch(dataType) {
// Request
case 0:
byteShift = 4;
memcpy(byte4, &buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
msgLength = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
msgString = (char *) malloc((msgLength+1)*sizeof(char));
byteShift = msgLength;
memcpy(msgString, &buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
msgString[byteShift] = '\0';
printf("Request Method: %s (%d Bytes)\n", msgString, msgLength);
byteShift = 4;
memcpy(byte4, &buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
dataCount = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
for(i = 1; i <= dataCount; i++) {
byteShift = 4;
memcpy(byte4, &buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
dataType = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
printf("Element %d(%d): \n",i,dataCount);
detectType(dataType);
}
break;
}
free(msgString);
return 0;
}
void detectType(int Type) {
switch (Type) {
case 1:
return getInt(buffer);
break;
case 2:
return getBool(buffer);
break;
case 3:
return getString(buffer);
break;
case 4:
return getDouble(buffer);
break;
case 256:
return getArray(buffer);
break;
case 257:
return getStruct(buffer);
break;
}
}
void getInt(unsigned char *Buffer) {
int data;
int j;
byteShift = 4;
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
data = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
for(j=1;j<=ebene;j++) printf(" ");
printf("Int value: %d\n",data);
}
void getBool(unsigned char *Buffer) {
int data;
int j;
byteShift = 1;
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
data = 0 + byte4[0];
for(j=1;j<=ebene;j++) printf(" ");
printf("Bool value: %d\n",data);
}
void getString(unsigned char *Buffer) {
int stringLength;
char *data;
int j;
byteShift = 4;
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
stringLength = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
data = (char *) malloc((stringLength+1)*sizeof(char));
byteShift = stringLength;
memcpy(data, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
data[stringLength] = '\0';
for(j=1;j<=ebene;j++) printf(" ");
printf("String value: %s (%d Bytes)\n",data,stringLength);
free(data);
}
void getDouble(unsigned char *Buffer) {
unsigned int Exponent, MantisseInt;
double data, Mantisse;
int j;
byteShift = 4;
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
MantisseInt = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
Exponent = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
Mantisse = MantisseInt / mantisseFaktor;
data = ldexp(Mantisse, Exponent);
for(j=1;j<=ebene;j++) printf(" ");
printf("Double value: %d\n",data);
}
void getArray(unsigned char *Buffer) {
int arrayCount;
int dataType;
int i, j;
byteShift = 4;
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
arrayCount = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
ebene = ebene + 1;
for(i=1; i<=arrayCount; i++) {
byteShift = 4;
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
dataType = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
for(j=1;j<=ebene;j++) printf(" ");
printf("Array value %d(%d): \n",i,arrayCount);
ebene = ebene + 1;
detectType(dataType);
ebene = ebene - 1;
}
ebene = ebene - 1;
}
void getStruct(unsigned char *Buffer) {
int structCount;
int stringLength;
int dataType;
char *data;
int i, j;
byteShift = 4;
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
structCount = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
ebene = ebene + 1;
for(i=1; i<=structCount; i++) {
byteShift = 4;
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
stringLength = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
data = (char *) malloc((stringLength+1)*sizeof(char));
byteShift = stringLength;
memcpy(data, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
data[stringLength] = '\0';
byteShift = 4;
memcpy(byte4, &Buffer[BufferPosition], byteShift);
BufferPosition = BufferPosition + byteShift;
dataType = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
for(j=1;j<=ebene;j++) printf(" ");
printf("Struct member %d(%d) (%s): \n",i,structCount,data);
free(data);
ebene = ebene + 1;
detectType(dataType);
ebene = ebene - 1;
}
ebene = ebene - 1;
}
Baue dann nach diesen Erkenntnissen am Client / Server / XML-Parser Geraffel.
Falls das am Ende tatsächlich alles laufen sollte...
Wenn da jemand Verbesserungen findet, ich meine, das Teil macht ja nichts außer die Daten logisch zu durchlaufen und ein wenig stdout vollzuschreiben... immer her damit, ich bin definitiv kein C-Entwickler