C++ #define, который получает строку

Я хочу создать ОЧЕНЬ простой метод запутывания, в основном я просто хочу xor каждую строку, поэтому вызываю

printf("%s\n", OBF("Test"));

Будет генерировать что-то вроде

printf("%s\n", unxor("\x65\x54\x42\x45"));

В этом случае я закодировал строку с помощью 1


person Lucifer M    schedule 02.11.2017    source источник
comment
Я не думаю, что есть способ перебрать строку в препроцессоре.   -  person Barmar    schedule 02.11.2017
comment
Напишите функцию.   -  person    schedule 02.11.2017
comment
Возможно, что-то получится с помощью метапрограммирования препроцессора, но я не уверен.   -  person Fred Larson    schedule 02.11.2017
comment
Не используйте printf в C++   -  person    schedule 02.11.2017
comment
понятия не имею, почему люди говорят, что это невозможно: stackoverflow.com/a/34981003/8874953   -  person Lucifer M    schedule 02.11.2017
comment
Итак, тогда: Возможный дубликат C++: как шифровать строки во время компиляции ?   -  person underscore_d    schedule 02.11.2017


Ответы (1)


Используя современный C++, вы можете написать это без каких-либо макросов, например:

#include <iostream>
#include <array>
#include <utility>
#include <cstddef>

constexpr const char key_byte{'1'};

template<::std::size_t VArrayItemsCount, ::std::size_t... Is> constexpr auto
obf_impl
(
    ::std::index_sequence<Is...>
,   char const ( & sz_text )[VArrayItemsCount]
)
-> ::std::array<char, VArrayItemsCount>
{
    return(::std::array<char, VArrayItemsCount>{static_cast<char>(sz_text[Is] ^ key_byte)..., '\0'});
}

template<::std::size_t VArrayItemsCount> constexpr auto
obf
(
    char const ( & sz_text )[VArrayItemsCount]
)
-> ::std::array<char, VArrayItemsCount>
{
    return
    (
        obf_impl<VArrayItemsCount>
        (
            ::std::make_index_sequence<VArrayItemsCount - ::std::size_t{1}>()
        ,   sz_text
        )
    );
}

int main()
{
    constexpr const auto hello{obf("hello")};
    ::std::cout << hello.data() << ::std::endl;
    return 0;
}

Запустите этот код в онлайн-компиляторе

person user7860670    schedule 02.11.2017