Байтовое редактирование

Тема в разделе "LANGS.C", создана пользователем BadLogin, 18 янв 2009.

  1. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Вообщем я знаю, что ответ на msdn, но времени нет, а пользуюсь я им крайне медленно, поэтому и прошу помощи здеся!

    Есть файл конфигурации ... нечитаемый в блокноте ... во FlexHex я заметил, что меняется только один байт по адресу 00-00-02-3Е, да это и не важно наверное ... вообщем мне нужно на билдере написать прогу, которая откроет этот файл, найдёт этот байт, изменит его и сохранит ...

    что за функции мне нужны ??? ну или рабочий кусочек - это вообще шоколадно )))

    Всем заранее спасибо!
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    CreateFile->SetFilePointer->WriteFile
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    кактотак
    Код (Text):
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3.     FILE *stream;
    4.     if( (stream = fopen( "file.txt", "r+" )) == NULL )
    5.     {
    6.         printf( "Error: The file was not opened\n");
    7.         return 0;
    8.     }
    9.  
    10.     fseek(stream, 0x23e, SEEK_SET);
    11.     char X=0;
    12.     fwrite((void*)&X,1,1,stream);
    13.     fclose(stream);
    14.     return 0;
    15. }
     
  4. mednice

    mednice New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2009
    Сообщения:
    9
    или так
    Код (Text):
    1. HANDLE hFile = CreateFile( "somefile.exe", GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0,  0 );
    2.  
    3.     if ( hFile != INVALID_HANDLE_VALUE )
    4.     {
    5.         szDw = 0;
    6.         SetFilePointer( hFile, 1588, NULL, 0 ); //1588 смещение в int
    7.         WriteFile( hFile, server, lstrlen( server ), &szDw, NULL );
    8.         szDw = 0;
    9.         if ( lstrlen( server ) < 30 )
    10.         {
    11.             WriteFile( hFile, zero, 1, &szDw, NULL );
    12.             }
    13.         }
     
  5. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Freeman

    Два вопросика )))

    0x23 - это как я понимаю адрес, но как он пересчитывается ?
    00 00 0E 3B - это то, что мне надо, что получится... 0х3643 ???

    (void*) - это ещё зачем ???
     
  6. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Да и ещё сложность для меня в том, что я знаю как отредактировать этот файл во FlexHex, а не в блокноте... в то время как fread возвращает значение как в блокноте
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    BadLogin
    fwrite первым параметром принимает указатель на буфер, куда осуществлять чтение. у тебя в кач-ве буфера выступает char X (т.е. НЕ указатель); потому и эти приседания.

    попробуй кстати:
    Код (Text):
    1. if( (stream = fopen( "file.txt", "rb+" )) == NULL )
    2.  //...
     
  8. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    что это ??

    и, кстати, что на счёт 0х23е - я как то не очень силён ... может ссылочка какая есть, чтоб почитать (на русском желательно)
     
  9. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    BadLogin
    вы о чем? в общем, прочтите хелп по ф-ции fwrite, особенно про режимы открытия ею файлов, и про ф-цию fseek.
     
  10. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    прочитал .. написано, что это смещение ... но в каком формате оно задаётся... я не знаю что такое "long offset"

    и ещё мне нужно вернуть байт - 01 или 00, а я не знаю что за тип данных мне нужен (((
     
  11. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    0x0E3B
     
  12. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    BadLogin
    заодно о форматах целых чисел и простых типах и их задании (typedef)
     
  13. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Код (Text):
    1. fseek (stream, 0x0E3B, SEEK_SET);
    2. char X,*Y;
    3. fread (&Y, 1, 1, stream);
    4. BinToHex(Y, &X, 1);
    5. Edit1->Text = X;
    при выполнении выдаёт ошибку
    Без конвертации выдаёт пробел, но мне то нужен байт "00" или "01"
     
  14. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Код (Text):
    1. char X,*Y;
    2. fread (&Y, 1, 1, stream);
    ты здесь пытаешься в кач-ве буфера куда писать взять адрес по которому лежит указатель (т.е. указатель на указатель на Y), а на самом деле нужен именно сам указатель по которому лежит твой буфер.
    и потом ,у тебя Y указывает в космос, т.к. он не инициализированный

    сделай так:
    Код (Text):
    1. char X,*Y;
    2. Y = new char[1];
    3. fread (Y, 1, 1, stream);
    4. //blablabla...
    5. delete []Y;
    + по-хорошему не забудь проверить, ск-ко реально прочиталось.
    а ты выкидываешь результат этой ф-ции почему-то..

    или же вообще хранить буффер на стеке:
    Код (Text):
    1. char X,Y;
    2. fread (&Y, 1, 1, stream);
    3. //blablabla...
     
  15. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    вообщем мой труд движется небольшими шажочками, ASCII символ прочитал ... функция BinToHex возвращает старший разряд (4 из 40, ну или 0 из 01), а мне нужно изменить как раз-таки младший разряд.... кроме того
    Код (Text):
    1. fread
    работает, но даёт немного не тот результат

    Код (Text):
    1. fwrite
    ни каких изменений в файле не производит (делал резервную копию и сравнивал во Флексе - идентичны)

    ИТОГ:
    1) как прочитать и записать байт полностью ?
    2) как сохранить изменения в файле ?

    P.S. прошу прощения за мою бестолковость, но с чего-то нужно начинать.
     
  16. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
  17. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
  18. _tmp17628

    _tmp17628 New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    144
    Если этот байт всегда на одном и том же месте, то просто сделай меппинг файла в память и измени нужный байт по указателю, и не надо никаких фреад...
     
  19. disaster

    disaster New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2009
    Сообщения:
    12
    _tmp17628
    Да, мэппинг как раз для этого и нужен. =)

    BadLogin
    Почему ты сначала сказал, что нужно изменить байт по адресу 00-00-02-3Е, а теперь меняешь его по адресу 00-00-0E-3B, пересчитал что ли как?