· 7 years ago · Apr 16, 2018, 03:40 AM
1#include <iostream>
2#include <inttypes.h>
3#include <cstring>
4#include <stdlib.h>
5#include <winsock2.h>
6using namespace std;
7
8struct msgStruct {
9 uint32_t secretKey;
10 uint16_t requestType;
11 uint16_t padding;
12 char * varName;
13 uint16_t varLen;
14 char * varVal;
15};
16
17struct intStr {
18 uint32_t secretKey;
19 uint16_t requestType;
20 uint16_t padding;
21};
22
23struct lenStr {
24 uint16_t varLen;
25 char * varVal;
26};
27
28
29int main()
30{
31 msgStruct myMsg;
32 myMsg.secretKey = 1070;
33 myMsg.requestType = 1;
34 myMsg.padding = 0;
35 myMsg.varName = "PATH";
36 myMsg.varVal = "/tmp/usr";
37 myMsg.varLen = strlen(myMsg.varVal);
38 cout << myMsg.varLen << endl;
39
40 char * target = new char [sizeof(uint32_t) + 2*sizeof(uint16_t) + strlen(myMsg.varName) + strlen(myMsg.varVal) + sizeof(myMsg.varLen) + 2];
41
42 //char *target = new char[size];
43 int net_secretKey = myMsg.secretKey;
44 int net_requestType = myMsg.requestType;
45 int net_padding = myMsg.padding;
46 memcpy(target, &net_secretKey, sizeof(net_secretKey));
47 memcpy(target+sizeof(net_secretKey), &net_requestType, sizeof(net_requestType));
48 memcpy(target+sizeof(net_secretKey) + sizeof(net_requestType), &net_padding, sizeof(net_padding));
49 memcpy(target+sizeof(net_secretKey) + sizeof(net_requestType) + sizeof(net_padding), myMsg.varName, strlen(myMsg.varName));
50 target[sizeof(net_secretKey) + sizeof(net_requestType) + sizeof(net_padding) + strlen(myMsg.varName)] = '\0';
51 memcpy(target+sizeof(net_secretKey) + sizeof(net_requestType) + sizeof(net_padding) + strlen(myMsg.varName) + 1, &myMsg.varLen, sizeof(myMsg.varLen));
52 memcpy(target+sizeof(net_secretKey) + sizeof(net_requestType) + sizeof(net_padding) + strlen(myMsg.varName) + sizeof(myMsg.varLen) + 1, myMsg.varVal, strlen(myMsg.varVal));
53 target[sizeof(net_secretKey) + sizeof(net_requestType) + sizeof(net_padding) + strlen(myMsg.varName) + strlen(myMsg.varVal) + sizeof(myMsg.varLen) + 1] = '\0';
54
55 intStr is;
56 memcpy(&is, target, sizeof(intStr));
57 //cout << is.secretKey << endl;
58 //cout << is.requestType << endl;
59 //cout << is.padding << endl;
60 int x;
61 char str1[5];
62 char str2[5];
63 int y = sizeof(net_secretKey) + sizeof(net_requestType) + sizeof(net_padding);
64
65 memcpy(&str1, target+12, 5);
66 //memcpy(&str2, target+19, 7);
67 cout << str1 << endl;
68 memcpy(&str2, target+19, myMsg.varLen + 1);
69 cout << str2 << endl;
70 cout << str1 << endl;
71 /*for (unsigned int i = y; i < sizeof(uint32_t) + 2*sizeof(uint16_t) + strlen(myMsg.varName) + strlen(myMsg.varVal) + sizeof(myMsg.varLen) + 10; i++) {
72
73 if (target[i] == '\0') {
74 cout << y << endl;
75 cout << i << endl;
76 y = i;
77 }
78 }*/
79 lenStr ls;
80 memcpy(&ls, target+17, sizeof(uint16_t));
81 //cout << "varlen is " << ls.varLen << endl;
82 msgStruct recMsg;
83 recMsg.secretKey = is.secretKey;
84 recMsg.requestType = is.requestType;
85 recMsg.padding = is.padding;
86 recMsg.varLen = ls.varLen;
87 recMsg.varName = str1;
88 recMsg.varVal = str2;
89
90 cout << recMsg.secretKey << endl;
91 cout << recMsg.requestType << endl;
92 cout << recMsg.padding << endl;
93 cout << recMsg.varName << endl;
94 cout << recMsg.varLen << endl;
95 cout << recMsg.varVal << endl;
96 return 0;
97}