Добрый всем день! Вот задался таким вопросом, возможен ли сабж? Пример: Было Code (Text): struct { int a = 1; int b = 2; char c[100]; } при следующей компиляции стало, например: Code (Text): struct { int b = 5; char c[110]; int a = 9; } конечно можно сделать так: Code (Text): int _key = __DATE__[4] * __DATE__[5]; #define _key1 1^_key #define _key2 2^_key struct { int a = _key1; int b = _key2; char c[_key+100]; } Но тогда как данные поменять местами в структуре? И можно ли присваивать рандомные значения _key1 и _key2 на этапе компилляции?
В общем я это тоже на с++ хотел делать и даже более, хотя бы взять авто крипт строк,с помощью макросов. И пришел к выводу что это можно сделать путем сторонего скрипта который бы изменял сорсы. Но это очень не удобно. Поэтому я перешел на масм32, там с помощью макросов можно творить чудеса. Единственно пока что код пишу медленнее, но думаю за месяц скорость увеличится.
Code (Text): int _key = __DATE__[4] * __DATE__[5]; #define _key1 1^_key #define _key2 2^_key struct { int a = _key1; int b = _key2; char c[_key+100]; } Значения заносятся когда идет инициализация структуры. struct _SOME s = {...data...}; struct _SOME s; s.a = ...; s.b = ...;
Забыл добавить, студия 2010. Может туда добавили вичи для реализации подобного? Типизированные энумы тут не к месту?
Может я тебя не понял, но это меняет значения местами, а не порядок следования имен переменных в структуре
Booster если коротко, то для создания пермутирующего протокола обмена между клиентом и сервером. Нужно, чтобы на клиент-сайде было трудно разбрать протокол, т.к. с каждой версией он будет по сути другим.
Используйте постобработку исполняемого файла - напишите программку-криптор, которая будет искать в скомпилированном ехе нужные структуры и шифровать их, ключ шифрования кладете тоже в определенную структуру... затем при работе программы вы берете ключ и дешифруете структуры...
gorodon поля структуры можно "шифровать" и на этапе компилляции, смотри выше, вопрос в том, как эти поля поменять местами в памяти
gloomyraven Генерируйте исходник перед сборкой. Нужно всего один файл генерировать, в котором объявление структуры.
можно использовать юнион структур и выбирать между ними согласно дефайну, задаваемому либо в опциях кмд строки компилера, либо в конфиг инклуде. можно использовать просто массив памяти и переопределять при обращениях. конкретизировать что и где опять же через макросы и дефайны. или вы хотели, чтоб оно само все переопределяло в рантайме? например, при запуске само случайно устанавливало порядок полей? тогда используйте вариант с массивом, а смещения полей случайно задавайте гденибудь в начале. доступ к полям, опять же, макросами или функциями. можно и руками кажен раз писать
имеется в виду заранее создать несколько вариантов структур, а потом при каждой сборке дефайном выбирать ту или иную? не универсально можно поподробнее? этим можно дополнить протокол, чтобы при каждом запуске, например, брался определенный ключ с сервера, и с помощью него задавалась структура протокола )
gloomyraven а? структура это просто массив памяти, а поля это меньшие участки в этом массиве определяемые смещением от начала и размером (ну и функционалом связанным с типом). те вы всегда можете записать чтонибудь вроде char m[100]; ... int i = *(int*)&m[8]; .. 8 - тут смещение поля типа int в структуре m. размер этого поля будет sizeof int. следующее поле должно быть по смещению не меньше 8 + sizeof(int), иначе поля будут перекрываться. можно сделать и юнион. например, так int i = *(int*)&m[8]; float f = *(float*)&m[8]; пример макроса для одного из полей. скажем, типа double по имени D #define D(m) (*(double*)&(m)[D_OFFS]) где D_OFFS - дефайн (2рой случай) или переменная (3тий случай) определяющие смещение поля D от начала структуры ессно, размер m должен быть не меньше, чем размер всех полей структуры