Преобразование файла в Hex
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 и сохранить это в текстовый файл?
я открываю файл следующим кодом:
как мне сделать преобразование файла в hex и сохранить это в текстовый файл?
Код записывает текстовой файл на место исходного файла, блоками в 64 символа.
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);
}
}
#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;
}
Приведу код, как информацию к размышлению :)
Предлагаешь человеку освоить STL? Конечно библиотека стоит того, чтоб его знать.
Спасибо, работает, но с ошибкой
FFFFFF8F FFFFFFD2 26 10 1B 29 71 6E 30
вместо
8F D2 26 10 1B 29 71 6E
может, можно решить это както? :)
Green
Спасибо, работает, но с ошибкой
FFFFFF8F FFFFFFD2 26 10 1B 29 71 6E 30
вместо
8F D2 26 10 1B 29 71 6E
может, можно решить это както? :)
это в файле который ты перегоняешь стоят какие-то управляющие символы. Или убери их вручную или проверяй считанный символ.
if(ch >=0 && ch < 255)
out << setw(2) << (int)ch << " ";
Код записывает текстовой файл на место исходного файла, блоками в 64 символа.
....
мда. Глобально.
А почему тогда собственно в столь монстроподобном коде не предусмотреть м-а-а-аленького окошечка позволяющего указать куда записывать результат? :)
мда. Глобально.
А почему тогда собственно в столь монстроподобном коде не предусмотреть м-а-а-аленького окошечка позволяющего указать куда записывать результат? :)
ОБЪЯСНИТЕЛЬНАЯ ЗАПИСКА kot_-у
IMHO если человек выставляет какой-то код на форум, то желательно, чтоб этот код был без бага. Поэтому я свои коды сперва проверяю. Но так как в то время на моем компе не было ни Buildera, ни Delphi, я мог только проверить код переводящий символы в hex на VisualC. Этот код проверил и выложил. И выделил с bold, те места кода, которых нужно изменить, если сохранять данные в другом файле. Но если посмотришь, Green тоже не возился ни с окном открытия, ни с окном сохранения.
А в программе Green-а, проблема с символами >= 0x80, это в основном кириллица. Они принимаются, за отрицательное значение. Но американские символы обрабатываются на ура. Где-то 50-60 лет тому назад, автора такой программы в СССР, растреляли бы. И cо спецом, предлагающим отсекать русские символы, тоже долго бы не возились.
IMHO если человек выставляет какой-то код на форум, то желательно, чтоб этот код был без бага.
Желательно, но не обязательно. Это форум для программистов, а не для вписывающих двоечников.
Поэтому я свои коды сперва проверяю.
Вопрос с подвохом: и как же ты проверяешь свои коды?
А в программе Green-а, проблема с символами >= 0x80, это в основном кириллица. Они принимаются, за отрицательное значение.
Ага...
И проблема решается одной заменой:
#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;
}
Но американские символы обрабатываются на ура. Где-то 50-60 лет тому назад, автора такой программы в СССР, растреляли бы. И cо спецом, предлагающим отсекать русские символы, тоже долго бы не возились.
Остроумно...
Но программистов пишущих, код приведенный тобой, я бы расстреливал и в наше счастливое время.
Я не буду долго рассказывать про его монстроподобность, неструктурированность, отсутствие стилистики и стройности, про потенциально опасные места и т.д.
Объясни, плз, что делает эта строчка:
byte *b = pszBuffer+iFileHandle+(iFileLength<<4);
И почему ты используешь операции сдвига вместо обычных арифметических, а вместо бинарных операций, операции арифметические?
И чем обусловленно использование одного хранилища для входной и выходной информации? Для запутывания вероятного противника?
Ну и т.д.
Не скажете?
Мне приходится писать в MS VS C++,
какие там аналоги функций FileOpen, FileRead
и тому подобные,
... некоторые строкие непонятны :(
iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenReadWrite);
например, что возвращает эта функция?
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);
Желательно, но не обязательно. Это форум для программистов, а не для вписывающих двоечников.
<skipped>
Green - ты что-то сильно психованный. Где чувство юмора? После того, как ответил kot_-у, подумал может поставить смайлик, чтоб было понятно, что это шутка. Но решил, что и без этого ясно, начинается же ответ со слов "ОБЪЯСНИТЕЛЬНАЯ...". Но ты уже второй раз не врубился.
На счет расстрела в наше счастливое время. От меня каждый пишет, как хочет. Я, в отличие от тебя не считаю себя пупом земли, и не считаю, что единственно правильно то, как я делаю, и каждый должен мне подражать, иначе к стенке.
ADanilov написал: хочу читать файл, перевести в hex, и сохранить куда-то. Пока еще, могу читать. Как перевести и как сохранять?
Я привел код перевода.
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;
}
}
Я хотел поспорить с тобой на счет твоего алгоритма поиска белых прямоугольников. Он мне кажется, как минимум неэффективным. Но к счастью, у меня не было времени в нем нормально разобраться. К счастью потому, что если ты такой обидчивый, то ...
Green - ты что-то сильно психованный. Где чувство юмора? После того, как ответил kot_-у, подумал может поставить смайлик, чтоб было понятно, что это шутка.
....
К счастью потому, что если ты такой обидчивый, то ...
Давайте плиз, не ссорится. Я вовсе не хотел своим замечанием кого либо обидеть - и твой пост я тоже восприянял как шутку.
Green
Не нужно столь серьезно воспринимать даже кажущиеся чужие промахи - форум создан для обсуждения и учебы, а никак для ссор.
В конце концов в основном для работы с файлами я то же предпочитаю использовать файловые потоки - но это не значит, что мне не интересно увидеть другое решение. То что я высказал в шутливой форме - вряд ли можно считать замечанием, потому как человек в своем коде сразу отметил - что и куда пишеться. А из претензий к коду - может быть единственная - просто нет возможности пробовать и тестировать - объявление объектов в цикле:
byte j=*b;
...
byte k = j%16;
...
я бы это убрал бы.
Green - ты что-то сильно психованный. Где чувство юмора?
Дома забыл... :)
На счет расстрела в наше счастливое время. От меня каждый пишет, как хочет.
"Как хочет" или "как может"?
Я, в отличие от тебя не считаю себя пупом земли,
Не удивительно. У земли не может быть два пупа.
и не считаю, что единственно правильно то, как я делаю, и каждый должен мне подражать, иначе к стенке.
Правильно то, что может быть аргументировано.
Я задал несколько вопросов в предыдущем посте, они как раз из области агрументированности.
Я хотел поспорить с тобой на счет твоего алгоритма поиска белых прямоугольников. Он мне кажется, как минимум неэффективным.
Неэфективным?
N^2 ты считаешь неэффективным?
Аргументируй (в соотв. ветке).
Есть идеи по-лучше, представь.
Но к счастью, у меня не было времени в нем нормально разобраться.
Вот это здорово... :D
"Я не знаю что у тебя тут делается, но это неэффективно"
К счастью потому, что если ты такой обидчивый, то ...
Я "обидчивый" только в том случае, когда переходят на личности, вместо обсуждения конкретных тем.
Кроме того, это не обидчивость, а вспыльчивость.
Обидчивость - качество иррациональное, а вспыльчивость иногда дает пользу.
Короче, не пугайся и давай свою ОБЪЕКТИВНУЮ критику моего (кстати, не такого уж и моего) алгоритма.
Выделил 10 минут, на твоего шедевра. Впечатления на том топике.