Код: Выделить всё
#include
#include
namespace _crypt {
// clang-format off
// compile-time seed
#define XSTR_SEED ((__TIME__[7] - '0') * 1ull + (__TIME__[6] - '0') * 10ull + \
(__TIME__[4] - '0') * 60ull + (__TIME__[3] - '0') * 600ull + \
(__TIME__[1] - '0') * 3600ull + (__TIME__[0] - '0') * 36000ull)
// -----------------------------------------------------------------------------
// @return a pseudo random number clamped at 0xFFFFFFFF
constexpr unsigned long long linear_congruent_generator(unsigned rounds) {
return 1013904223ull + (1664525ull * ((rounds> 0) ? linear_congruent_generator(rounds - 1) : (XSTR_SEED) )) % 0xFFFFFFFF;
}
// -----------------------------------------------------------------------------
#define Random() linear_congruent_generator(10)
#define XSTR_RANDOM_NUMBER(Min, Max) (Min + (Random() % (Max - Min + 1)))
// -----------------------------------------------------------------------------
constexpr const unsigned long long XORKEY = XSTR_RANDOM_NUMBER(0, 0xFF);
// -----------------------------------------------------------------------------
template
constexpr Char encrypt_character(const Char character, int index) {
return character ^ (static_cast(XORKEY) + index);
}
template
class Xor_string {
public:
const unsigned _nb_chars = (size - 1);
Char _string[size];
// if every goes alright this constructor should be executed at compile time
inline constexpr Xor_string(const Char* string) : _string{} {
for (unsigned i = 0; i < size; ++i) _string[i] = encrypt_character(string[i], i);
}
// This is executed at runtime.
// HACK: although decrypt() is const we modify '_string' in place
const Char* decrypt() const {
Char* string = const_cast(_string);
for (unsigned t = 0; t < _nb_chars; t++) {
string[t] = string[t] ^ (static_cast(XORKEY) + t);
}
string[_nb_chars] = '\0';
return string;
}
};
} // namespace _crypt
//#ifdef _XOR_STINRG_
#define XorS(name, my_string) constexpr _crypt::Xor_string name(my_string)
#define XorString(my_string) []{constexpr _crypt::Xor_string expr(my_string); return expr; }().decrypt()
// Crypt normal string char*
#define _c( string ) XorString( string )
#define XorWS(name, my_string) constexpr _crypt::Xor_string name(my_string)
#define XorWideString(my_string) []{ constexpr _crypt::Xor_string expr(my_string); return expr; }().decrypt()
// _crypt wide characters
#define _cw( string ) XorWideString( string )
int main() {
static std::string test_string = _c(R"(
fdaslkjdsfafjaksdljfa;lksdflajljffffffffffffffffasdfklasjdfkljaskdljfkl;asjdf;aljdsf;kljasdklfjklsadjfklasdjkl;fjasdkl;dfj;lkasdjf;lkasdjf;lkjasd;klfjldsjf;kljasdklfjklsadjfklasdjkl
sdjf;lkasjdfkl;ajsd;lkfjaskl;djf;klasjdf;lkajsdlkfjal;sdkjfkl;asdjrfioqwejhotpiqhntg;lsadnvclmkasdhjdo;fijasd;lkfja;wlkjetpoiquropiqwejrlsjfaadlkjfoiqawhghsngb;lkasewriopqweujtophkjzdnvlkzxdnlkfahsjeftoipwqhytpoiqwhngfkjsafbgfnkljasjf;laksddjfopiqaweehtgoasnfd;laksddjfopiqaweehtgoasnfdldsfj;alskeeurtpoiqwe
kdjsf;lokasudtrfiopqweujtpoiqu;lqwekngsadndfl;ksadjvb;lkasujropiwqehjrtpoiwqethgl;knf;lkasvnv;lkanss;dletrjwioqeurpoqweujrpowqejtojsdfa;ljf
)");
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79130211/g-8-4-0-error-overflow-in-constant-expression-fpermissive[/url]