Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Преобразование файла в Hex

2.1K
29 марта 2005 года
ADanilov
33 / / 15.10.2004
я открываю файл следующим кодом:

int iFileHandle, iFileLength, iBytesRead;
char *pszBuffer;

if (OpenDialog1->Execute())
{
try
{
iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead);
iFileLength = FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);
pszBuffer = new char[iFileLength+4];
iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength);
FileClose(iFileHandle);

delete [] pszBuffer;
}
catch(...)
{
Application->MessageBox("Ошибка открытия", "File Error", IDOK);
}
}



как мне сделать преобразование файла в hex и сохранить это в текстовый файл?
7.2K
29 марта 2005 года
Mongoose
32 / / 23.09.2004
Цитата:
Originally posted by ADanilov
я открываю файл следующим кодом:
как мне сделать преобразование файла в hex и сохранить это в текстовый файл?

Код записывает текстовой файл на место исходного файла, блоками в 64 символа.

Код:
int iFileHandle, iFileLength, iBytesRead;
  char *pszBuffer;

  if (OpenDialog1->Execute())
  {
    try
    {
      iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenReadWrite);
      iFileLength = FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      pszBuffer = new char[2*iFileLength + (iFileLength<<4) +4];
      byte *b = pszBuffer+iFileHandle+(iFileLength<<4);
      iBytesRead = FileRead(iFileHandle, b, iFileLength);
//      FileClose(iFileHandle);
      char *ch = pszBuffer;
      char hex[] = "0123456789ABCDEF";
      int ndx = 0;
      for(int i=0;i<iFileLength;i++)
      {
        byte j=*b;    b++;
        byte k = j%16;
        j = (j-k)>>4;
        *ch = hex[j]; ch++;
        *ch = hex[k]; ch++;
        ndx++;
        if(ndx==32)
        {
          *ch = 13; ch++;
          *ch = 10; ch++;
          ndx = 0;
        }

      }

      FileSeek(iFileHandle,0,0);
      FileWrite(iFileHandle, pszBuffer, ch-pszBuffer);
      FileClose(iFileHandle);

      delete [] pszBuffer;
    }
    catch(...)
    {
      Application->MessageBox("Ошибка открытия", "File Error", IDOK);
    }
  }
3
30 марта 2005 года
Green
4.8K / / 20.01.2000
Приведу код, как информацию к размышлению :)
Код:
#include <fstream>
#include <iomanip>

using namespace std;

int main()
{
    ifstream in("file.dat", ios::binary);
    ofstream out("file.txt");

    if( !in.is_open() || !out.is_open()) return -1;

    out << uppercase << hex << setfill('0') ;

    char ch;
    while( !in.eof() )
    {
        in.read(&ch, sizeof(char));
        out << setw(2) << (int)ch << " ";
    }

    return 0;
}
7.2K
30 марта 2005 года
Mongoose
32 / / 23.09.2004
Цитата:
Originally posted by Green
Приведу код, как информацию к размышлению :)

Предлагаешь человеку освоить STL? Конечно библиотека стоит того, чтоб его знать.

14K
05 ноября 2005 года
Sourmonk
3 / / 01.11.2005
Green

Спасибо, работает, но с ошибкой

FFFFFF8F FFFFFFD2 26 10 1B 29 71 6E 30

вместо

8F D2 26 10 1B 29 71 6E

может, можно решить это както? :)
1
05 ноября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Sourmonk
Green

Спасибо, работает, но с ошибкой

FFFFFF8F FFFFFFD2 26 10 1B 29 71 6E 30

вместо

8F D2 26 10 1B 29 71 6E

может, можно решить это както? :)


это в файле который ты перегоняешь стоят какие-то управляющие символы. Или убери их вручную или проверяй считанный символ.

 
Код:
in.read(&ch, sizeof(char));
       if(ch >=0 && ch < 255)
       out << setw(2) << (int)ch << " ";
1
05 ноября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Mongoose
Код записывает текстовой файл на место исходного файла, блоками в 64 символа.
....


мда. Глобально.
А почему тогда собственно в столь монстроподобном коде не предусмотреть м-а-а-аленького окошечка позволяющего указать куда записывать результат? :)

488
05 ноября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by kot_
мда. Глобально.
А почему тогда собственно в столь монстроподобном коде не предусмотреть м-а-а-аленького окошечка позволяющего указать куда записывать результат? :)

ОБЪЯСНИТЕЛЬНАЯ ЗАПИСКА kot_-у

IMHO если человек выставляет какой-то код на форум, то желательно, чтоб этот код был без бага. Поэтому я свои коды сперва проверяю. Но так как в то время на моем компе не было ни Buildera, ни Delphi, я мог только проверить код переводящий символы в hex на VisualC. Этот код проверил и выложил. И выделил с bold, те места кода, которых нужно изменить, если сохранять данные в другом файле. Но если посмотришь, Green тоже не возился ни с окном открытия, ни с окном сохранения.

А в программе Green-а, проблема с символами >= 0x80, это в основном кириллица. Они принимаются, за отрицательное значение. Но американские символы обрабатываются на ура. Где-то 50-60 лет тому назад, автора такой программы в СССР, растреляли бы. И cо спецом, предлагающим отсекать русские символы, тоже долго бы не возились.

3
05 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Mоngооsе

IMHO если человек выставляет какой-то код на форум, то желательно, чтоб этот код был без бага.


Желательно, но не обязательно. Это форум для программистов, а не для вписывающих двоечников.

Цитата:
Originally posted by Mоngооsе

Поэтому я свои коды сперва проверяю.


Вопрос с подвохом: и как же ты проверяешь свои коды?

Цитата:
Originally posted by Mоngооsе

А в программе Green-а, проблема с символами >= 0x80, это в основном кириллица. Они принимаются, за отрицательное значение.


Ага...
И проблема решается одной заменой:

Код:
#include <fstream>
#include <iomanip>

using namespace std;

int main()
{
    ifstream in("file.dat", ios::binary);
    ofstream out("file.txt");

    if( !in.is_open() || !out.is_open()) return -1;

    out << uppercase << hex << setfill('0') ;

    unsigned char ch;
    while( !in.eof() )
    {
        in.read((char*)&ch, sizeof(unsigned char));
        out << setw(2) << (int)ch << " ";
    }

    return 0;
}


Цитата:
Originally posted by Mоngооsе

Но американские символы обрабатываются на ура. Где-то 50-60 лет тому назад, автора такой программы в СССР, растреляли бы. И cо спецом, предлагающим отсекать русские символы, тоже долго бы не возились.


Остроумно...
Но программистов пишущих, код приведенный тобой, я бы расстреливал и в наше счастливое время.
Я не буду долго рассказывать про его монстроподобность, неструктурированность, отсутствие стилистики и стройности, про потенциально опасные места и т.д.
Объясни, плз, что делает эта строчка:
byte *b = pszBuffer+iFileHandle+(iFileLength<<4);

И почему ты используешь операции сдвига вместо обычных арифметических, а вместо бинарных операций, операции арифметические?
И чем обусловленно использование одного хранилища для входной и выходной информации? Для запутывания вероятного противника?
Ну и т.д.

14K
05 ноября 2005 года
Sourmonk
3 / / 01.11.2005
Originally posted by Mоngооsе
Не скажете?

Мне приходится писать в MS VS C++,
какие там аналоги функций FileOpen, FileRead
и тому подобные,
... некоторые строкие непонятны :(

iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenReadWrite);
например, что возвращает эта функция?
488
05 ноября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Sourmonk
Originally posted by Mоngооsе
Не скажете?

Мне приходится писать в MS VS C++,
какие там аналоги функций FileOpen, FileRead
и тому подобные,
... некоторые строкие непонятны :(

iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenReadWrite);
например, что возвращает эта функция?


HANDLE hFile = CreateFile(имя_файла, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

DWORD dwSize, dwRead;
dwSize = GetFileSize(hFile, NULL);
void *lpF = VirtualAlloc(NULL, dwSize, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE);
ReadFile(hFile, lpF, dwSize, &dwRead, NULL);
CloseHandle(hFile);
...
...
VirtualFree(lpF, dwSize, MEM_RELEASE);

488
05 ноября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Green
Желательно, но не обязательно. Это форум для программистов, а не для вписывающих двоечников.
<skipped>


Green - ты что-то сильно психованный. Где чувство юмора? После того, как ответил kot_-у, подумал может поставить смайлик, чтоб было понятно, что это шутка. Но решил, что и без этого ясно, начинается же ответ со слов "ОБЪЯСНИТЕЛЬНАЯ...". Но ты уже второй раз не врубился.

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

ADanilov написал: хочу читать файл, перевести в hex, и сохранить куда-то. Пока еще, могу читать. Как перевести и как сохранять?

Я привел код перевода.

Код:
char hex[] = "0123456789ABCDEF";
      int ndx = 0;
      for(int i=0;i<iFileLength;i++)
      {
        byte j=*b;    b++;
        byte k = j%16;
        j = (j-k)>>4;
        *ch = hex[j]; ch++;
        *ch = hex[k]; ch++;
        ndx++;
        if(ndx==32)
        {
          *ch = 13; ch++;
          *ch = 10; ch++;
          ndx = 0;
        }
      }
Код сохранения привести не смог. Файл читается компонентом Builder-а TOpenDialog, естественно, сохранять нужно с использованием TSaveDialog.

Я хотел поспорить с тобой на счет твоего алгоритма поиска белых прямоугольников. Он мне кажется, как минимум неэффективным. Но к счастью, у меня не было времени в нем нормально разобраться. К счастью потому, что если ты такой обидчивый, то ...
1
05 ноября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Mоngооsе
Green - ты что-то сильно психованный. Где чувство юмора? После того, как ответил kot_-у, подумал может поставить смайлик, чтоб было понятно, что это шутка.
....
К счастью потому, что если ты такой обидчивый, то ...


Давайте плиз, не ссорится. Я вовсе не хотел своим замечанием кого либо обидеть - и твой пост я тоже восприянял как шутку.
Green
Не нужно столь серьезно воспринимать даже кажущиеся чужие промахи - форум создан для обсуждения и учебы, а никак для ссор.

В конце концов в основном для работы с файлами я то же предпочитаю использовать файловые потоки - но это не значит, что мне не интересно увидеть другое решение. То что я высказал в шутливой форме - вряд ли можно считать замечанием, потому как человек в своем коде сразу отметил - что и куда пишеться. А из претензий к коду - может быть единственная - просто нет возможности пробовать и тестировать - объявление объектов в цикле:

 
Код:
...
byte j=*b;
...
byte k = j%16;
...

я бы это убрал бы.
3
05 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Mоngооsе
Green - ты что-то сильно психованный. Где чувство юмора?


Дома забыл... :)

Цитата:
Originally posted by Mоngооsе

На счет расстрела в наше счастливое время. От меня каждый пишет, как хочет.


"Как хочет" или "как может"?

Цитата:
Originally posted by Mоngооsе

Я, в отличие от тебя не считаю себя пупом земли,


Не удивительно. У земли не может быть два пупа.

Цитата:
Originally posted by Mоngооsе

и не считаю, что единственно правильно то, как я делаю, и каждый должен мне подражать, иначе к стенке.


Правильно то, что может быть аргументировано.
Я задал несколько вопросов в предыдущем посте, они как раз из области агрументированности.

Цитата:
Originally posted by Mоngооsе

Я хотел поспорить с тобой на счет твоего алгоритма поиска белых прямоугольников. Он мне кажется, как минимум неэффективным.


Неэфективным?
N^2 ты считаешь неэффективным?
Аргументируй (в соотв. ветке).
Есть идеи по-лучше, представь.

Цитата:
Originally posted by Mоngооsе

Но к счастью, у меня не было времени в нем нормально разобраться.


Вот это здорово... :D
"Я не знаю что у тебя тут делается, но это неэффективно"

Цитата:
Originally posted by Mоngооsе

К счастью потому, что если ты такой обидчивый, то ...


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

Короче, не пугайся и давай свою ОБЪЕКТИВНУЮ критику моего (кстати, не такого уж и моего) алгоритма.

488
05 ноября 2005 года
Mоngооsе
465 / / 01.04.2005
Ладно. Ты уже перешел на более мягкий тон. Да еще кое-где ты даже пошутил. В крайнем случае мне так показалось.

Выделил 10 минут, на твоего шедевра. Впечатления на том топике.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог