Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перевод двоичного кода в символ [XP]


Страницы:   1 2 3

Vladimir ©   (2012-03-25 13:54:00) 

Здравствуйте! Каким образом перевести двоичный или шестнадцатеричный код в символ? Есть файл с содержанием типа:

1B252D3132333435 5840504A4C0D0A40 504A4C204649524D 57415245203D4B45
524E454C20202020 2020202020200D0A 2456455256332E30 302E30312E303620
202020204150522D 32362D3230313100 0000000000000000 31303030244B4552
0000000000800000 0300005100030002 0000000000000000 E59FF054E59FF054
E59FF054E59FF054 E59FF054E59FF054 E59FF054E59FF054 E59F0054E59F1054
E59F3054E1500001 0A000003E1510003 3490200434812004 3AFFFFFBE59F103C
E3A02000E1530001 348320043AFFFFFC E1A0F00E00000134 0000011C00000104
000000EC000000D4 000000BC000000A4 0000008C00000F2C 4000800040008000
4000E400E24DD004 E92D0001E3A00101 E590001CE58D0004 E8BD8001E24DD004
E92D0001E3A00101 E5900018E58D0004 E8BD8001E24DD004 E92D0001E3A00101
E5900014E58D0004 E8BD8001E24DD004 E92D0001E3A00101 E5900010E58D0004
E8BD8001E24DD004 E92D0001E3A00101 E590000CE58D0004 E8BD8001E24DD004
E92D0001E3A00101 E5900008E58D0004 E8BD8001E24DD004 E92D0001E3A00101
E5900004E58D0004 E8BD8001E3A00000 E3A01000E3A02000 E3A03000E3A04000
E3A05000E3A06000 E3A07000E3A08000 E3A09000E3A0A000 E3A0B000E3A0C000
E3A0D000E3A0E000 E10F0000E38000C0 E121F000E59F178C E3A00000E5810000
E59F1784E5810000 E59F1780E5810000 E59F177CE5810000 E59F1778E3E00000
E5810000E59F1770 E5810000E59F076C E3A01000E5801000 E59F0764E3A01010
E5801000E3A00000 EE070F17EE080F17 EE110F10E3C00C23 E3C00007E3800080
E3800A01EE010F10 E59F0738E3E0100E E5801000E59F0730 E5901000E3C11601

и так далее. Мне нужно преобразовать этот шеснадцатеричный код в символы. Я так понял для этого нужно сначала преобразовать его в двоичный. Это я вроде понял как сделать. А как затем преобразовать двоичный код в символы?


Sha   (2012-03-26 16:49:00) [21]

Это фантастика.

Проверил на Windows XP Pentium D 2.8GHz 2Gb:
файл 12Mb показывает через 1sec.

Загрузка текста в TMemo различается в 300 раз?


Vladimir   (2012-03-26 16:30:00) [22]


> У тебя действительно код [21] выполняется 5 мин
> на чистом компе "AMD не старый 4000+" c 2+ Гб ОП?

Да. Но не весь код [21] а только строка Memo1.Lines.Text:=hex; до неё обрабатывается за долю секунды.


Anatoly Podgoretsky   (2012-03-26 15:59:00) [23]


> Моя задача только изменять часть  данных в нем и не нарушать целостность файла.


"изменить к примеру номер версии в файле"

Трудно назвать это не нарушать целостность файла.
Кроме того гнать двоичный файл, а он такой а не текстовый - смешно и не предсказуемо.
Одно это "0000000000000000" чего стоит.


Sha   (2012-03-26 15:30:00) [24]

> Vladimir ©   (26.03.12 15:21) [26]

У тебя действительно код [21] выполняется 5 мин
на чистом компе "AMD не старый 4000+" c 2+ Гб ОП?


Vladimir   (2012-03-26 15:21:00) [25]


> Кто же придумал такую передачу данных?

Я не знаю кто это придумал. Моя задача только изменять часть данных в нем и не нарушать целостность файла.

> У меня 12Mb менее секунды. Че за комп у тебя?

Да загружает в память он меньше чем за секунду, а вот передает текст в Memo очень долго. Почему так не знаю. Комп нормальный вроде AMD не старый 4000+ оперативки тоже норм.


Юрий Зотов   (2012-03-26 15:16:00) [26]

> Vladimir ©   (26.03.12 11:56) [14]

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


Sha   (2012-03-26 14:13:00) [27]

У меня 12Mb менее секунды. Че за комп у тебя?


Anatoly Podgoretsky   (2012-03-26 14:05:00) [28]

> Vladimir  (26.03.2012 14:03:22)  [22]

DisableControls


Vladimir   (2012-03-26 14:03:00) [29]


> Memo1.Lines.Text:=hex;

Те же самые минут 5 присваивается


Sha   (2012-03-26 13:55:00) [30]

Скорость можешь примерно оценить при помощи этого кода.
Вместо имени экзешника выбери свой файл до "кодирования".
В мемо увидишь шестнадцатеричные данные.
Только глупо весь файл грузить - все равно на экране не поместится.
А памяти для avi-шек может не хватить.

procedure TForm1.Button4Click(Sender: TObject);
var
 fi: File;
 bin, hex: AnsiString;
 size, count: integer;
begin;
 AssignFile(fi, ParamStr(0));
 FileMode:=0;
{$I-}
 Reset(fi,1);
{$I+}
 FileMode:=2;
 if IOResult=0 then try;
   size:=FileSize(fi);
   SetLength(bin,size);
   BlockRead(fi,bin[1],size,count);
   SetLength(bin,count);
   SetLength(hex,count*2);
   BinToHex(pointer(bin),pointer(hex),count);
   Memo1.Lines.Text:=hex;
 finally
   CloseFile(fi);
   end;
 end;


Sha   (2012-03-26 12:42:00) [31]

На самом деле, весь процесс загрузки и преобразования 10 мб займет менее секунды.
Вопрос не в этом, а в том, что твое решение выглядит несколько необычно.


Vladimir   (2012-03-26 12:36:00) [32]


> Посмотри Seek или SetFilePos.

Это то я знаю, но это не поможет... наверно... получается надо будет при загрузке файла искать нужную информацию и если найдена, то изменять...

Быстрее то конечно будет, но все же как быть если требуется отобразить шестнадцатеричный код? Ведь тот же самый Delphi выводит этот код за секунды, а у меня получается при простом приравнивании Text=Text уходит минут 5 в то время как на побайтное чтение и занесение в невизуальный список уходят те же самые несколько секунд как и на загрузку файла у Delphi. Почему?


Sha   (2012-03-26 12:28:00) [33]

> Vladimir ©   (26.03.12 12:19) [17]

Ясно, тогда забудь MMF.
Посмотри Seek или SetFilePos.


Vladimir   (2012-03-26 12:19:00) [34]


> Проще всего твоя задача решается с использованием отображения
> файла в память (MMF).

Посмотрел тут...
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1247596906&n=6

Но не совсем понял чем мне это поможет и как это сделать.


Sha   (2012-03-26 12:11:00) [35]

До и после обработки можно переформатировать данные.
Разумеется, здесь речь идет не о всех данных, а только
об очень малой порции данных, которые требуется изменить.


Sha   (2012-03-26 12:07:00) [36]

> Vladimir ©   (26.03.12 11:56) [14]
> В виде кода он в целях защиты информации.

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

> Все что нужно мне - открыть его и изменить нужный сектор

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


Vladimir   (2012-03-26 11:56:00) [37]

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

Создается файл не мной, а мне он приходит только на проверку и  редактирование(изменить к примеру номер версии в файле). В виде кода он в целях защиты информации.

Все что нужно мне - открыть его и изменить нужный сектор, к примеру:

0123456789ABCDEF на FEDCBA9876543210

И плюс, конечно, проверить правильность файла(имя файла, информация внутри файла, содержание).

Вот в общем то и вся задача.


Sha   (2012-03-26 11:27:00) [38]

Ты бы задачу целиком озвучил, включая то,
зачем был создан файл и зачем его показывать.


Vladimir   (2012-03-26 11:19:00) [39]

Возник ещё один вопрос. Теперь по поводу чтения файла и показа полученных данных. Файлы по размеру в общем то небольшие до 10mb~270 000 строк.

Сделал пока так:

//переменные
var
FS     : TFileStream;     // Файловый поток для чтения из файла
Buff   : array of byte;   // Буфер для чтения из файла( массив байт )
//---------------------
i      : integer;
begin
//если выбрали файл, то
if od.Execute and (od.FileName<>'') then
begin
 // отлов ошибок
 try
 // создаем файловый поток
 FS := TFileStream.Create(od.FileName, fmOpenRead);
 // устанавливаем размер буфера
 SetLength(Buff, FS.Size);
 // пишем имя файла
 HDname_E.Text := od.FileName;
 // визуализация
 Status_L.Caption := 'Чтение и расшифровка данных из файла...';
 // -//-//-//-//-
 pb.Max := FS.Size;
 // загружаем побайтно
 for i:=0 to Length(Buff)-1 do
  begin
   // получаем данные
   FS.ReadBuffer(Buff[i], 1);
   // переводим в шестнадцатиричную систему
   HDData.Add( format('%x', [Buff[i]]) );
   // визуализируем
   pb.Position := i;
   // не зависаем
   Application.ProcessMessages;
  end;
 // выгружаем файловый поток
 FS.Free;
 // переносим данные в визуальное поле
 HDData_M.Text := HDData.Text;
 // визуализируем
 Status_L.Caption := 'Файл успешно загружен';
 // -//-//-//-//-
 pb.Position := 0;
 // если что-то пошло не так, то
 except on E:Exception do
  begin
   // сообщаем об этом
   ShowMessage('Ошибка: ' + E.Message);
  end;
 end;
end;

Но в этом случае на строке HDData_M.Text := HDData.Text; компьютер умирает минут на 5, а мне это совершенно не нужно. И если в строку HDData.Add( format('%x', [Buff[i]]) ); изменить на HDData.Text := HDData.Text + ( format('%x', [Buff[i]]) ); то загрузка будет идти минут 15, что мне тоже совершенно не нужно.

Как правильно организовать загрузку и вывод данных в текстовое поле?


begin...end   (2012-03-25 20:06:00) [40]

> Sha ©   (25.03.12 19:47) [10]

Ясно. Ну по крайней мере, если входной текст содержит только символы из множеств '0'..'9', 'a'..'f' и 'A'..'F', то результат в буфере верен.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо