- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
void SaveEncryptedFile( const char *text, int len, const char* filename )
{
char* pEncryptedText = new char[strlen(text)+1];
string x1 = "you'll";
string x2 = "never";
string x3 = "get a";
string x4 = "password";
char l_pBuf[255];
sprintf(l_pBuf,"%d",30*11/3);
string result = x1+x2+x2+x1+l_pBuf+x3;
encryptString(text,pEncryptedText,result.c_str(),strlen(text),result.length()); // там внутри xor
FILE* pFile = fopen(filename, "wb");
if (pFile)
{
fwrite(pEncryptedText,sizeof(char),len,pFile);
fclose(pFile);
}
delete[] pEncryptedText;
}
Нашёл в рабочем проекте. Для "расшифровки" файла используется ещё одна такая же функция.
ЗЫ да это просто обфускация данных что бы пользователи руками не лазили. до того как узнал про ROT13/etc, сам нечто подобное писал.
Если мне не изменяет память, "password" сперва неявно сконвертится к (временному) стрингу, после чего x4 сконструируется из этого стринга. Как максимум два раза вызовется конструктор, как минимум - один (стандарт допускает устранение копирования в таком случае).
Лол, а не указатель просто копируется?
Ага, а потом ты пишешь s[0] = 'x' и БАБАХ!
P.S. Хотя в некоторых реализациях строк (но не в std::string) может и указатель копироваться. В Qt и c++ builder вроде бы так и делают, ибо один хрен copy-on-write.
Только std::string в COW не умеет, поэтому выделяет память и копирует данные при создании.
просто в -O2 это одно и то же
(15.3), and brace-enclosed initializer lists (8.5.1) is called copy-initialization and is equivalent to the form
<...>
The semantics of initializers are as follows.
<...>
— If the initialization is direct-initialization, or if it is copy-initialization where the cv-unqualified version of
the source type is the same class as, or a derived class of, the class of the destination, (прим. очевидно, что литерал const char * не является подклассом std::string) constructors are
considered. <...>
<...>
— Otherwise (i.e., for the remaining copy-initialization cases), user-defined conversion sequences that can
convert from the source type to the destination type or (when a conversion function is used) to a derived
class thereof are enumerated as described in 13.3.1.4, and the best one is chosen through overload resolution
(13.3).
То есть здесь происходит неявное преобразование const char * в std::string, дабы наш std::string x4 можно было бы инициализировать копированием.
string x1 = "you'll";
string x2 = "never";
string x3 = "get a";
string x4 = "password";
string result = x1+x2+x2+x1+l_pBuf+x3;
Окончания еще не проходили?
Хорошо что на завтра уроки не надо делать, да?