2009-09-04 99 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的固定映射),但不能通過算法查找標識符,然後爲它們創建映射。