2016-01-27 3 views
0

У меня есть несколько проблем с моим кодом, который я не уверен в понимании. Я читаю в файле (вы можете попробовать с любым файлом), чтобы получить шестнадцатеричные значения. Я пытаюсь найти определенные шестнадцатеричные значения и изменить их - это работает, но это намного позже, чем должно быть. Пример будет:Шар меняющий сосед

0xAA 0xAB 0xAC 0xAD 0XAE ... 0XCD 0xCE 

Я хотел бы изменить 0xAB, но мой код меняет 0XCD. не знаю, почему это происходит, но, возможно, я делаю это неправильно. также есть способ автоматически получить длину файла? Я просто помещаю буфер, который является частью файла, но я хотел бы получить реальную длину.

#include <stdio.h> 
#include <string.h> 

#define FLEN 512 

int convert_to_hex(char c); 

int main(int argc, char *argv[]) { 

    char c; 
    int i = 0; 

    FILE *fp = fopen(argv[1],"rb"); 

    for(i = 0; i < FLEN; i++) { 
     c = convert_to_hex(fgetc(fp)); 
     printf("%02x ", c); 
    } 
    printf("\n"); 
} 

int convert_to_hex(char c) 
{ 
    char hexVal[3]; 
    sprintf(hexVal, "%02X", 0x69); 

    if(strncmp(&c, hexVal, 2) == 1) { 
     printf(">> %s ", hexVal); // indicate where it change (late) 
     return c + 1; 
    } 
    return c; 
} 
+0

Должен быть char hexVal [4] вместо hexVal [3], одно место для нулевого завершающего символа – novice

+0

http://stackoverflow.com/questions/238603/how-can-i-get-a-files-size -in-c - Чтобы получить длину файла в C++ – novice

+0

@novice - да, он все равно имеет такое же поведение. спасибо за другую ссылку тоже –

ответ

1

Это ошибка.

if(strncmp(&c, hexVal, 2) == 1) { 

Первый аргумент strncmp() должен быть строкой нулем. Однако вы передаете ему указатель на один символ. Я не понимаю, что ваша функция convert_to_hex() пытается выполнить, иначе я мог бы предложить альтернативу.

Чтобы определить длину файла, просто проверьте, является ли возвращаемое значение от fgetc() равно EOF. EOF - это специальное значение, указывающее, что вы находитесь в конце файла.

int c = fgetc(fp); // declare an int to hold the return value from fgetc() 
int fileLength = 0; // keep track of the file length 
while(c != EOF) { // repeat while we're not at the end of the file 
    c = convert_to_hex(c); 
    printf("%02x ", c); 
    c = fgetc(fp); // get the next character 
    fileLength++; // increment fileLength for each character of the file. 
} 
// we're done! - fileLength now holds the length of the file 
1

оказывается, ответ был очень прост, меняю convert_hex к:

int convert_to_hex(char c) 
{ 
    if (c == 0x69) { 
     c = c + 1; 
    } 
    return c; 
} 

this answer что решить это для меня. спасибо всем остальным тоже.

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