2015-01-13 95 views
0

我有了它這個特定字符串的二進制文件:^@^Aname^@Team Fortress 2搜索字符串,其中包含轉義字符

這是我嘗試使用memmem找到它:

char *game = "Team Fortress 2"; 
sprintf(searchString,"\1\1name\1%s\0",game); 

... 

if(pos = memmem(buffer,result,searchString,strlen(searchString))) 

我如何搭配轉義字符^@^A? 它似乎找到\1\1name,但在searchString中找不到game

+1

怎麼能''\ 1「'代表'」^ @「'和'」^ A「'? –

+2

Control- @是C中的空字節,''\ 0''(因爲'@'在ISO 8859-1和Unicode等中的'A'之前)。 '^ A'通常用來表示Control-A,字節值''\ 1''或''\ 001''。包含^ @的文件通常被認爲是二進制文件。 –

回答

1

因爲你的字符串包含空值,所以它不是一個有效的C字符串,並且字符串操作函數(如memmem和strlen)將不起作用。你將不得不推出自己的版本。

最簡單的方法是遍歷字符串的每個索引,然後使用第二個循環根據要搜索的字符串進行檢查。有更加奇特和快捷的方法,但是如果你不需要額外的速度,它們更難理解和實施。有關該主題的概述,請參閱Wikipedia

0

這是不是caret notation?

char *game = "Team Fortress 2"; 
sprintf(searchString,"%c%cname%c%s\0",(char)0, (char)1, (char)0, game); 

... 

if(pos = memmem(buffer,result,searchString,strlen(searchString))) 
+0

是的,我意識到我不能把它當作一個字符串。由於第一個字符是空字符。 'searchString'的長度爲1. –

+0

那麼如何編寫自己的或使用現有的memfind?它應該很容易。 – stryku

+1

@EngieOP'sprintf'的返回值會告訴你寫了多少個字符,所以你可以使用它來代替'strlen'。 – interjay

相關問題