Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Перевод двоичного кода в символ   Найти похожие ветки 

 
Vladimir ©   (2012-03-25 13:54) [0]

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

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

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


 
RWolf ©   (2012-03-25 14:04) [1]

откусываешь по 2 символа и применяешь Chr(StrToInt("$" + sym))


 
Юрий Зотов ©   (2012-03-25 14:19) [2]

Есть подозрение на XYZ.

> Мне нужно преобразовать этот шеснадцатеричный код в символы

Допустим, преобразовали (как подсказал RWolf). Но что Вы дальше с этими символами делать будете? Первый же символ - непечатный (Esc), и он явно не один.


 
Sha ©   (2012-03-25 14:23) [3]

Их там много

procedure TForm1.Button1Click(Sender: TObject);
var
 s, t: AnsiString;
 i, len, code: integer;
begin
 s:="1B252D3132333435 5840504A4C0D0A40 504A4C204649524D 57415245203D4B45";
 len:=length(s);
 i:=2;
 t:="";
 while i<len do begin;
   if (s[i-1]=" ") or (s[i]=" ") then inc(i)
   else begin;
     code:=StrToIntDef("$"+copy(s,i-1,2),-1);
     if code>=0 then t:=t+AnsiChar(code);
     inc(i,2);
     end;
   end;
 ShowMessage(t);
 end;


 
Sha ©   (2012-03-25 14:25) [4]

правильнее

while i<=len do begin;


 
Vladimir ©   (2012-03-25 15:11) [5]


> Sha ©

Ваш код помог, спасибо.


 
Sha ©   (2012-03-25 15:32) [6]

На самом деле код [3] очень медленный,
он годится только для экспериментов.

Все же имеет смысл прислушаться к [2].


 
begin...end ©   (2012-03-25 16:08) [7]


uses Classes;

var
 S, T: string;
 L: Integer;
begin
 S := "1B252D3132333435 5840504A4C0D0A40 504A4C204649524D 57415245203D4B45";
 S := StringReplace(S, " ", "", [rfReplaceAll]);
 L := Length(S) div 2;
 SetLength(T, L);
 SetLength(T, HexToBin(PChar(S), PChar(T), L));
 ShowMessage(T)
end


В справке (D7) по функции HexToBin есть одна ошибка и одна неточность.


 
Sha ©   (2012-03-25 18:24) [8]

> begin...end ©   (25.03.12 16:08) [7]
> В справке (D7) по функции HexToBin есть одна ошибка и одна неточность.

... и одна ошибка в самой функции.


 
begin...end ©   (2012-03-25 19:21) [9]

> Sha ©   (25.03.12 18:24) [8]

А что там? Delphi под рукой теперь будет только завтра, а любопытство раздирает уже сейчас :)


 
Sha ©   (2012-03-25 19:47) [10]

> begin...end ©   (25.03.12 19:21) [9]
> А что там? Delphi под рукой теперь будет только завтра,
> а любопытство раздирает уже сейчас :)

Все символы из множества ["0".."f"]
считаются правильными двоичными цифрами,
остальные символы считаются неправильными.

Особенно интересно, как затейливо вычисляется
результат в буфере в случае неверных входных данных


 
begin...end ©   (2012-03-25 20:06) [11]

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

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


 
Vladimir ©   (2012-03-26 11:19) [12]

Возник ещё один вопрос. Теперь по поводу чтения файла и показа полученных данных. Файлы по размеру в общем то небольшие до 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, что мне тоже совершенно не нужно.

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


 
Sha ©   (2012-03-26 11:27) [13]

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


 
Vladimir ©   (2012-03-26 11:56) [14]

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

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

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

0123456789ABCDEF на FEDCBA9876543210

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

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


 
Sha ©   (2012-03-26 12:07) [15]

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

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

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

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


 
Sha ©   (2012-03-26 12:11) [16]

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


 
Vladimir ©   (2012-03-26 12:19) [17]


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

Посмотрел тут...
http://delphimaster.net/view/16-1247596906/

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


 
Sha ©   (2012-03-26 12:28) [18]

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

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


 
Vladimir ©   (2012-03-26 12:36) [19]


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

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

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


 
Sha ©   (2012-03-26 12:42) [20]

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


 
Sha ©   (2012-03-26 13:55) [21]

Скорость можешь примерно оценить при помощи этого кода.
Вместо имени экзешника выбери свой файл до "кодирования".
В мемо увидишь шестнадцатеричные данные.
Только глупо весь файл грузить - все равно на экране не поместится.
А памяти для 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;


 
Vladimir ©   (2012-03-26 14:03) [22]


> Memo1.Lines.Text:=hex;

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


 
Anatoly Podgoretsky ©   (2012-03-26 14:05) [23]

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

DisableControls


 
Sha ©   (2012-03-26 14:13) [24]

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


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

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

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


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


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

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

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

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


 
Sha ©   (2012-03-26 15:30) [27]

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

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


 
Anatoly Podgoretsky ©   (2012-03-26 15:59) [28]


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


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

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


 
Vladimir ©   (2012-03-26 16:30) [29]


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

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


 
Sha ©   (2012-03-26 16:49) [30]

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

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

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


 
Sha ©   (2012-03-26 17:04) [31]

Появился повод включить сегодня AMD-K6-III@500MHz,
если будет время,


 
Vladimir ©   (2012-03-26 17:04) [32]


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

да... вот файл который загружаю
http://orfei-mebel.ru/1/test.hd


 
Sha ©   (2012-03-26 17:13) [33]

для этого файла время выполнения пресловутого оператора на Пентиум-Д равно 438 msec


 
Vladimir ©   (2012-03-26 17:28) [34]


> для этого файла время выполнения пресловутого оператора
> на Пентиум-Д равно 438 msec

Как бы странно это не было, но проблема именно в TMemo. То есть заменим memo на edit к примеру и код выполняется моментально, а с мемо ОЧЕНЬ долго. У меня Gode Gear RAD Studio 2009 = Delphi 2009


 
Юрий Зотов ©   (2012-03-26 18:11) [35]

А если так:

Memo1.Lines.BeginUpdate;
try
 Memo1.Lines.Text := hex;
finally
 Memo1.Lines.EndUpdate;
end;


 
Vladimir ©   (2012-03-26 19:02) [36]


> Юрий Зотов

К сожалению и так тоже самое


 
brother ©   (2012-03-26 19:23) [37]

> К сожалению и так тоже самое

не верю! точно весь код озвучен?


 
Sha ©   (2012-03-26 20:12) [38]

AMD-K6-III@500MHz 352Mb справился с твоим файлом за 3.5 сек

А комп работал на E6850 работал ... 5 мин.
Загрузка одного из ядер - почти 100%.
Помогло отключение слишком интеллектуального WordWrap в Memo.
После этого хватило 0.25 сек.

Интересно, что я пробовал включать/отключать WordWrap на Pentium-D.
Там это на результат абсолютно не влияло.
По-видимому, MS что-то химичит в своих потрохах.


 
Vladimir ©   (2012-03-26 22:38) [39]


> Интересно, что я пробовал включать/отключать WordWrap на
> Pentium-D.

Действительно дело в свойстве WordWrap - отключил и грузит меньше чем за пол секунды. А почему так не знаете?


 
Sha ©   (2012-03-26 22:54) [40]

> А почему так не знаете?

можно предположить, что Билли, как и ты,
тоже работает целиком со всем текстом


 
Anatoly Podgoretsky ©   (2012-03-26 23:00) [41]

WordWrap это для строк, а у тебя двоичные данные, кроме того это медленно


 
Jeer ©   (2012-03-26 23:07) [42]


> Sha ©   (26.03.12 17:04) [31]
>
> Появился повод включить сегодня AMD-K6-III@500MHz,
> если будет время,


Аха-ха..
Может мне Корвет на i8080 реанимировать ? :)


 
Sha ©   (2012-03-26 23:11) [43]

> Jeer ©   (26.03.12 23:07) [42]

Ща поработал, установил обновления, получил массу удовольствия.
За время пребывания в шкафу часы убежали вперед на 12 минут.


 
Jeer ©   (2012-03-27 00:22) [44]


> Sha ©   (26.03.12 23:11) [43]
>
> > Jeer ©   (26.03.12 23:07) [42]
>
> Ща поработал, установил обновления, получил массу удовольствия.
>
> За время пребывания в шкафу часы убежали вперед на 12 минут.
>


Тут мне, сват на днях, передал в ремонт часы древние "электроника".
Что бы я ни делал - 10 минут в сутки они решили идти своим ходом, опережая современность.


 
Юрий Зотов ©   (2012-03-27 01:45) [45]


> Jeer ©   (27.03.12 00:22) [44]

В качестве генератора древние часы обычно использовали частоту сети, так что 10 минут в сутки - это еще немного (всего 0.7%, а частота сети может гулять гораздо сильнее).


 
Германн ©   (2012-03-27 01:50) [46]

> Jeer ©   (26.03.12 23:07) [42]
> > Sha ©   (26.03.12 17:04) [31]
> > Появился повод включить сегодня AMD-K6-III@500MHz,
> > если будет время,
> Аха-ха..
> Может мне Корвет на i8080 реанимировать ? :)

Моя практика показывает, что в квартире нужно сделать хороший ремонт. Тогда (если жена - хозяйка) места для "старого хлама" не останется!
:)


 
KilkennyCat ©   (2012-03-27 02:39) [47]


> Юрий Зотов ©   (27.03.12 01:45) [45]

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


 
Германн ©   (2012-03-27 03:45) [48]

<offtop>
Мне на 50 подарили мои друзья/родственники из Бердянска настенные часы. Ходят нормально, но жрут батарейки просто как "проглоты"! Пришлось их спрятать в шкаф. :)
</offtop>


 
Sha ©   (2012-03-27 11:09) [49]

Сейчас специально перепроверил все на вчерашнем компе.
Скорость работы не зависит от состояния WordWrap.
Проект полностью перебилдивал туда-сюда.

Т.о. имеем:
Два компа с одной и той же версией Windows (XP pro 2002 SP 3), обновления регулярно.
Одна и та же версия Delphi 7 со всеми апдейтами.
WordWrap работает по-разному на одной длинной строке из одного длинного слова.
Копать дальше не охота.


 
Sha ©   (2012-03-27 11:11) [50]

ну вы поняли, что неохота



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.07 c
15-1338358473
Bluejohn
2012-05-30 10:14
2013.03.22
Найти быстро место в исходнике


2-1340008979
webpauk
2012-06-18 12:42
2013.03.22
как впихнуть в ImageList иконку нестандартного размера


15-1329209570
Димка На
2012-02-14 12:52
2013.03.22
Как сделать чтобы WinControl ловил mousemove за пределами себя.?


15-1340746939
Дмитрий С
2012-06-27 01:42
2013.03.22
Можно ли добавить свой пункт в меню "Отправить"


3-1278051371
ford
2010-07-02 10:16
2013.03.22
плохой индекс в FireBird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский