C预处理器能够通过char处理字符串char吗?

时间:2009-09-04 22:37:37

标签: c string c-preprocessor compile-time

我想在编译时隐藏字符串。我知道它可以在其他预处理器中完成,但我还没有找到一种方法来使用 C 预处理器。

4 个答案:

答案 0 :(得分:2)

嗯,你可以做到,但这很难看。

#define ENCODE_STRING_14(str) {\
            str[0] ^ 0x020,\
            str[1] ^ 0x020,\
            str[2] ^ 0x020,\
            str[3] ^ 0x020,\
            str[4] ^ 0x020,\
            str[5] ^ 0x020,\
            str[6] ^ 0x020,\
            str[7] ^ 0x020,\
            str[8] ^ 0x020,\
            str[9] ^ 0x020,\
            str[10] ^ 0x020,\
            str[11] ^ 0x020,\
            str[12] ^ 0x020,\
            '\0'\
            }

void Decode( char *str, int length )
{
    for( int i = 0; i < length - 1; ++i )
    {
        str[i] ^= 0x20;
    }
}

char hello[] = ENCODE_STRING_14("Hello, World!");

int main()
{
    printf("%s\n", hello);
    Decode( hello, 14 );
    printf("%s\n", hello);
    return 0;
}

在VS2005中编译了带有优化,该字符串作为“hELLO \ x0C \ 0wORLD \ x01”存储在可执行文件中。现在,显然,xor与0x20不是隐藏字符串的好函数。当然,你必须为每个字符串长度#define一个宏。

显然,这不是最好的解决方案。 C ++模板元编程更适合。您还可以在单​​独的机器可读文件中编写所有字符串,并编写一个单独的程序来解析它,以您认为合适的方式隐藏字符串并将其全部输出到.h / .c中。这两个都是比这更好的解决方案。

答案 1 :(得分:1)

不,C预处理器无法逐字处理字符串。

无论如何,你有没有标识符或字符串?您可以使用具有固定映射的标识符(即,如果您知道name1出现,您可以提供到xq23的固定映射),但您无法通过算法查找标识符,然后为它们创建映射。

答案 2 :(得分:0)

不,C预处理器无法按照您的建议索引字符串。

出于好奇,您使用的其他预处理器可以做到这一点吗?

答案 3 :(得分:0)

不,我想不出用预处理器做任何事情。

这个相关问题可能会对您有所帮助:How to hide a string in binary code?