Представление файла в 16-ричном коде в С++

Тема в разделе "WASM.BEGINNERS", создана пользователем MHX_23, 14 фев 2011.

  1. MHX_23

    MHX_23 New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2010
    Сообщения:
    7
    Работаю Borland Builder C++ 6
    Подскажите, пожалуйста:
    Необходимо файл любого типа, открываемый через opendialog, представить в виде текста из символов 16-ричного кода. А потом вернуть его обратно. Содержимое файла, конечно должно остаться прежним.
    Спасибо, за помощь.
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Если перевод осуществлять правильно, то файл и не изменится.
    Код (Text):
    1. UINT r2h(byte*buf,char*txt,UINT cnt,UINT max)
    2. {
    3.   char[16] hex=(48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70);
    4.   UINT i;
    5.   for (i=0;(i<cnt)&(i*2<max-1);i++)
    6.   {
    7.     txt[i*2+1]=hex[(buf[i]&&0xF0)>>4];
    8.     txt[i*2]=hex[buf[i]&&0x0F];
    9.   }
    10.   i=i*2+1;
    11.   txt[i-1]=0;
    12.   return i;
    13. }
    на входе buf,cnt - данные из файла и его длина, txt,max - буфер под шестнадцатеричную строку и его размер
    на выходе - количество байт занятых в буфере под строку шестнадцатеричных значений.
     
  3. MHX_23

    MHX_23 New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2010
    Сообщения:
    7
    buf - данные из файла?
    Что это означает, ну есть файл C:\abc.qwe(любого типа), где его данные?
    Опиши поподробнее переменные buf,cnt,txt,max, пожалуйста.
     
  4. niakris

    niakris Дмитрий

    Публикаций:
    0
    Регистрация:
    3 сен 2008
    Сообщения:
    45
    - На винте :) А в буфер тебе их нужно прочитать :) где-то так:
    Код (Text):
    1. invoke CreateFile,lp_name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    2. invoke CreateFileMapping,eax,NULL,PAGE_READONLY,0,0,NULL
    3. invoke MapViewOfFile,eax,FILE_MAP_READ,0,0,0
    в результате в eax у тебя адрес буффера :)
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.330
    MHX_23
    Опиши задачу подробней.
    Что значит "открываемый через opendialog"? opendialog файлы не открывает, а только возвращает выбранное пользователем имя.
    Что значит "представить в виде текста"? кому представить? сохранить в буфере? показать в окне?
    Что значит "потом вернуть его обратно"? что вернуть? содержимое файла? содержимое файла "в виде текста"?
     
  6. niakris

    niakris Дмитрий

    Публикаций:
    0
    Регистрация:
    3 сен 2008
    Сообщения:
    45
    rmn, я так понял, человеку нужен простенький hex редактор...
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    MHX_23
    bintodb.exe в пакете masm ?

    или на С в файл ... ?
    Код (Text):
    1. #include <stdio.h>
    2. #include <string.h>
    3.  
    4. FILE* in    = NULL;
    5. FILE* out   = NULL;
    6. int   x  = 0;
    7. int   hex   = 0x00;
    8. char* oFile;
    9.  
    10. int main(int argn, char *argv[]){
    11.     if(!argv[1]) return 0;
    12.    
    13.     if(!(in = fopen(argv[1], "r"))) return 0;
    14.     oFile = strcat(argv[1], ".hexDump");
    15.     if(!(out = fopen(oFile, "w"))) return 0;
    16.    
    17.     while((hex = fgetc(in)) != EOF){
    18.               if(!(++x & 0xFF)) fprintf(out ,"0x%02X,\n", hex);
    19.               else fprintf(out ,"0x%02X, ", hex);
    20.     }
    21.    
    22.     fclose(in);
    23.     fclose(out);
    24.     return 0;
    25. }
     
  8. MHX_23

    MHX_23 New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2010
    Сообщения:
    7
    Опиши задачу подробней.
    Нужно зашифровать файл, а потом расшифровать. Алгоритм работает со строкой 16-ричных символов. Как файл сделать строкой таких символов, а после вернуть эту строку снова в файл, который будет одинаков с исходным.
    открываемый через opendialog
    имел в виду:
    Код (Text):
    1. AnsiString filename;
    2. if (OpenDialog1->Execute())
    3. {
    4. file = OpenDialog1->FileName;
    5. Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
    6. }