2015-01-13 2 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, но не с game в searchString.

+1

Как '' \ \ "" представлять как '"^@ "' и '"^A "'? –

+2

Control- @ - это нулевой байт, '' \ 0'' в C (потому что '@' подходит до 'A' в ISO 8859-1 и Unicode и т. Д.). '^ A' часто используется для обозначения значения Control-A, байта' '\ 1'' или' '\ 001''. Файлы, содержащие^@, обычно считаются двоичными файлами. –

ответ

1

Поскольку ваша строка содержит аннулирует это не действительный C струнные и обработки строк функции, такие как memmem и StrLen не будет работать. Вам придется перевернуть свою версию.

Самый простой способ - пропустить каждый индекс строки, а затем использовать второй цикл, чтобы проверить его на строку, которую вы ищете. Есть более быстрые и быстрые методы, но их сложнее понять и реализовать правильно, если вам не нужна дополнительная скорость. См. Wikipedia для обзора темы.

0

Это не каретная нотация?

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

Смежные вопросы