2009-09-04 100 views

回答

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”。现在,显然,与0x20异或不是一个很好的函数来隐藏你的字符串。当然,你必须为每个字符串长度定义一个宏。

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

+0

不在gcc上编译,试过各种-std =选项。 – 2011-12-23 18:30:37

0

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

出于好奇,你有什么其他的预处理器可以做到这一点?

1

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

您是否有任何标识符或字符串?对于带有固定映射的标识符,您可以做很多事情(也就是说,如果您知道name1出现,您可以提供到xq23的固定映射),但不能通过算法查找标识符,然后为它们创建映射。