Поиск строки в памяти - PullRequest
       59

Поиск строки в памяти

1 голос
/ 31 августа 2011

Я пытаюсь заставить этот код работать, начиная с здесь

    char *mem = (unsigned char *) 0xF0000;
    int length, i;
    unsigned char checksum;
    while ((unsigned int) mem < 0x100000) {
        if (mem[0] == '_' && mem[1] == 'S' && mem[2] == 'M' && mem[3] == '_') {
            length = mem[5];
            checksum = 0;
            for(i = 0; i < length; i++) {
                checksum += mem[i];
            }
            if(checksum == 0) break;
        }
        mem += 16;
}

Есть некоторые ошибки типа, такие как cant init char * с unsigned char *.

когда я пытаюсь заменить char * на unsigned char * int первой строкой, я не могу использовать нотацию [], как я могу использовать memcmp с этим кодом?

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

В первой строке вы приводите к unsigned char*, но попробуйте присвоить char*. Почему бы не привести к char* напрямую?

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

0 голосов
/ 01 сентября 2011

Код не работает, потому что это неверный способ определения адреса структуры точки входа smbios на компьютере EFI,

0 голосов
/ 31 августа 2011

Какую часть вы хотите скопировать?

int start = ?; //wherever you want to start... (0,1,2,...,maxlength)
int len = ?;   //however long you need it to be ((maxlength-start) > len > 0)
char *mymem = malloc(len);
memcpy(mymem, mem+start, len);

РЕДАКТИРОВАТЬ: опс ... неправильно это :) вы хотите сравнить:)

for(...){
    char* search = "_SM_";
    char* mymem = (char*)(mem + (i*16));
    if (strncmp(search,mymem,4) == 0){
        length = (int)mymem + 4; // 0(_),1(S),2(M),3(_),4
        checksum = 0;
        ...
    }
}
...