qqwe с такой структурой будет как минимум неудобно работать. А как же поля местами менять автоматом? для каждого поля придется делать свой дефайн, учитывать размер поля и шаффлить (переставлять рандомно), так?
gloomyraven А какой смысл постоянно менять протокол между клиентом и сервером? Или у вас с каждой новой версией сервера нужно обновлять всех клиентов? Если протокол нужно защитить от чужих глаз, то можно просто шифровать. Если же нужна защита от нечестного клиента, то либо всё расчитывать на сервере, либо громоздкие расчёты произведённые на стороне клиента отсылать для проверки нескольким случайно выбранным другим клиентам. Кстати даже шифрование некоторого значения не поможет его спрятать, ведь еще остатся поиск по принципу "изменилось/не изменилось". Ключ для шифрования значения должен динамически меняться, а само значение перемещаться в памяти, тогда его найти будет существенно сложнее.
Black_mirror именно так само собой - сжатие + ssl да, но если протокол меняется раз в неделю, скажем, то кому-то придется раз в неделю заново исследовать протокол я хочу сделать, чтобы не в памяти перемещалось, а в самом протоколе: в один день идут данные "111222333", в другой те же данный идут 121123323, и это должен понимать как сервер, так и клиент, вот в чем смысл.
gloomyraven Плюс генерилки в том, что у вас генерируется код без макробесия, что очень хорошо. Макробесием это сделать можно, но получится не красиво и не удобно.
Кому интересно накидал небольшой код (конечно он занял бы строчек 10 на Руби и по времени во столько же раз меньше, но всё же сделал на с++), который берет файл main.txt и переставляет местами члены структур, может код и бажный, но тестовая версия работает. Code (Text): #include <Windows.h> #include <stdio.h> #include <algorithm> #include <numeric> #include <vector> #include <iterator> #pragma comment(linker, "/ENTRY:main") #define MAX_STRLEN 1024 void main() { FILE *hFile = NULL; bool isEOF; int lscope=0, rscope=0; // количество левых и правых скобок {} std::vector< std::string > v; std::vector<unsigned int> vv; char rline[MAX_STRLEN]; fpos_t start_pos, end_pos; hFile = fopen("main.txt", "r+"); if (hFile) { int state = 0; int next_state = 1; loop: switch (state) { case 0: // очередную читаем строку { memset(rline, 0, sizeof(rline)); fgets(rline, MAX_STRLEN, hFile); isEOF = feof(hFile); if (ferror(hFile)) break; else {state = next_state;} goto loop; } case 1: // проверяем строку на начало объявления структуры { // если объявлена структура, заносим с список члены структыры if (NULL != strstr(rline, "typedef struct")) { lscope++; fgetpos(hFile, &start_pos); // сохраняем позицию в файле после "{" state = 0; next_state = 2; } else { if (isEOF) break; state = 0; next_state = 1; } goto loop; } // обработка структуры case 2: { state = 0, next_state = 2; if (strstr(rline, "{")) lscope++; if (strstr(rline, "}")) rscope++; //если дошли до конца структуры (проверяем количество открывающих и закрывающих //скобок) if (rscope == lscope) { // сохраняем позицию после "}", чтобы можно было продолжить парсинг fgetpos(hFile, &end_pos); // устанавливаем позицию после "typedef.." и "{" fsetpos(hFile, &start_pos); // создаем вектор из чисел 0..n-1 (n-число элементов в структуре) for(unsigned int i = 0; i < v.size(); i++) vv.push_back(i); // шафлим числа в созданном вектре std::random_shuffle( vv.begin(), vv.end() ); // теперь записываем поля структуры в порядке, который указан // в шаввленном вектре vv for(unsigned int i = 0; i < v.size(); i++) { fputs(v[vv[i]].c_str(), hFile); } if (isEOF) break; lscope = 0; rscope = 0; v.clear(); vv.clear(); fsetpos(hFile, &end_pos); // восстанавливаем позицию в файле state = 0, next_state = 1; goto loop; } //else goto loop; // иначе записываем в вектор поле структуры if (lscope>0) v.push_back(rline); goto loop; } } } fclose(hFile); ExitProcess(0); } Ну это так, шалости конечно...