Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.10.2011, 00:23
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию HEX данные

Всем привет. Delphi начал изучать совсем не давно и не все справочники дают то чего хотелось бы. Хочу построить одно небольшое приложение которое будет работать с HEX данными.
Обрабатывать HEX в текст и обратно. Нашел один сайт хорошо отображающий данную задачу в действии hex.foxtools.ru
Буду очень благодарен кто поможет в данной задаче.

Пытаюсь использовать найденный в сети пример кода, но без особых результатов:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  s: String;
  i: Integer;
begin
  s := '$A0';
  i := StrToInt(s);
  ShowMessage(IntToHex(i,2));
end;
Ответить с цитированием
  #2  
Старый 30.10.2011, 01:10
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Что не получается?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 30.10.2011, 10:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  Memo1.Clear;
  for i:=1 to Length(Edit1.Text) do
    Memo1.Text:=Memo1.Text+IntToHex(ord(Edit1.Text[i]), 2);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 30.10.2011, 12:03
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Что не получается?
В коде конкретно указанные данные с которыми работают. А вот как быть если необходимо работать с выбранным файлом. Как правильно прочить HEX данные файла и поместить их в переменную или Edit1.
Ответить с цитированием
  #5  
Старый 30.10.2011, 21:16
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Смотря какие данные читать, прочитай в справке про BlockRead.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 25.11.2011, 19:09
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Смотря какие данные читать, прочитай в справке про BlockRead.
BlockRead это все ясно. Хотя не совсем. Меня интересует подобное действие. Смогу я при помощи данной команды такое сделать? Или как тогда быть.

В примере был открыт обычный текстовый файл с текстом "Text".
Ответить с цитированием
  #7  
Старый 25.11.2011, 19:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,090
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну и в чем проблема?
Прими то, что любые данные, даже текст, это некоторые числа. Для компьютера они записаны в двоичной системе, но их всегда можно перевести в любую другую систему исчисления.

Для файла у тебя 2 варианта.
1. Читать файл как текст и переводить отдельные символы в коды (Ord(S[i]) даст тебе десятичное значение для I-го символа строки S).
2. Читать файл как File Of Byte, например, и переводить значения в соотв. символы (Chr(B[i]) даст тебе символ, соотв. значению в I-ой ячейке некоторого массива байт B).
Ответить с цитированием
  #8  
Старый 25.11.2011, 20:40
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

мм.. туговато...
Ответить с цитированием
  #9  
Старый 25.11.2011, 21:21
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

Совет от Imlike абсолютно правильный! Полностью присоединяюсь.
Но раз возникли трудности- постараюсь помочь.
Итак, здесь прога для чтения файла и его представления в HEX- виде
Кидаешь Edit, Memo и пару кнопок.
С этим все ясно.
Теперь о процедуре чтения файла. Здесь я его открываю как байтовый файл-те за 1 цикл чтения читается 1 байт.
Пишем его в промежут. переменную z.
Далее этот байт представляется в виде HEX-строки из двух символов.
Добавляем его в промежут строковую переменную s
Как только набираем 16 байт- перезаписываем эту строку в Memo1
а саму строку обнуляем. ИТД до конца файла.
Тут надо понять принцип.
Для компьютера любая буква-это такой же байт как и любой другой.
А вот на экране этот байт представляется символом, который берется из таблицы кодировки. Другими словами, все буквы (и цифры) расположены в виде таблицы и поэтому каждой букве соответствует определенный код (те ее номер в этой табл). Вот это преобразование здесь и приведено.

В Memo сделай моноширинный шрифт (Courier New) иначе столбцы будут неровными

Код:
{--выбор файла----------------------}
procedure TForm1.Button2Click(Sender: TObject);
begin
with OpenDialog1 do
    if Execute then Edit1.Text:=FileName;
end;

{--------чтение файла-----------}
procedure TForm1.Button1Click(Sender: TObject);
var
F:file of byte;
z:byte;
s:string;
i:integer;
begin
Memo1.Clear;
s:='';
i:=0;
assignfile(F,Edit1.Text);reset(F);
while not eof(F) do
    begin
    read(F,z);s:=s+IntToHex(z,2)+'  ';
    i:=(i+1) mod 16;
    if (i=0) or eof(F) then
        begin
        Memo1.Lines.Add(s);
        s:='';
        end;
    end;
end;
Ответить с цитированием
  #10  
Старый 25.11.2011, 21:37
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Спасибо. Немного понятнее. Сейчас будем пробовать. Надо же и обратный путь проложить.
Нашел вот такой пример
Код:
function HexToInt(s: string): integer;
label
  gte;
var
  tempt: string;
  i: integer;
begin
  tempt := '';
  if s = '' then
  begin
    HexToInt := 0;
    goto gte;
  end;
  for i := 1 to Length(s) do
  begin
    tempt := tempt + IntToHex(Ord(s[i]), 2);
  end;
  HexToInt := StrToInt('$' + tempt);
  gte:
end;
Но что-то как-то не совсем понятно как запустить, да и комментарии тоже не утешительные
Цитата:
это функция - маразматичный маразм, просто слов нет.

Последний раз редактировалось Kaktuz, 25.11.2011 в 22:13.
Ответить с цитированием
  #11  
Старый 26.11.2011, 01:11
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

Действительно шедевр....
Распечатай и повесь в сортире.
================================================
Итак, обратная задача- из строки сделать integer
Самое умное- использоваь то что изобрели до тебя.
См. функцию HexToBin в справке
Вот пример ее использования.
Код:
var
Buf:array[0..15] of byte;

HexToBin('ff', @Buf[2], 1); //засылает результат во 2 байт буфера
Здесь функция преобразует строковое HEX-представление в число
и пишет в буфер.
Единственный ее недостаток- непонятно как она это делает.
Поэтому привожу свой код (только как иллюстрация)

Код:
function HexToStr(s:string):longword;
var
i:integer;
begin
s:='0'+Trim(s);
Result:=0;i:=1;
    for i:=1 to length(s) do
        case s[i] of
        '0'..'9':Result:=Result*16 + ord(s[i])-48;
        'A'..'F':Result:=Result*16 + ord(s[i])-55;
        'a'..'f':Result:=Result*16 + ord(s[i])-87;
        end    //case
end;
Здесь понятен принцип. Если символ находится от '0' до '9'
то от его порядкового номера вычитается 48.
Это потому что символ '0' занимает 48-ю клетку в таблице кодировки
а ему соответствует численное значение 0.
и символы '0'..'9' расположены подряд.
Аналогично и с символами 'a'..'f'
Вот и вся механика.
Ответить с цитированием
  #12  
Старый 26.11.2011, 23:20
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Блин! Функции... Почему они такие непонятные
Я же не запущу ее с кнопки. Читал http://delphi но... там математика.
Как мне теперь эту функцию подключить к использованию.
Запишем:
private
function HexToStr(s:string):longword;
мм.. что-то совсем туго...
Цитата:
Что же такое функция и зачем она нужна?
А нужна она, как не банально это звучит для облегчения жизни программисту.
Ответить с цитированием
  #13  
Старый 26.11.2011, 23:33
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Зачем же обязательно в private, можно и в public. Тогда будет доступна из других юнитов, а так правильно.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #14  
Старый 28.11.2011, 21:50
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Процедуры научился подключать, разобрался, но функции...
мм... учитывая данный пример мне необходимо отправлять данные в переменную "s" два значения (0A) которые будет переведены в функцию и возращены в виде символа в "resultat"

s:=edit1.text;
memo1.text:=HexToStr;

Под вид такого?

Последний раз редактировалось Kaktuz, 28.11.2011 в 22:04.
Ответить с цитированием
  #15  
Старый 24.05.2012, 16:50
lex6630 lex6630 вне форума
Прохожий
 
Регистрация: 20.05.2012
Адрес: Isvrtyn
Сообщения: 2
Версия Delphi: 7
Репутация: 10
По умолчанию Всем Доброго времяни суток !

Вот Попробывал То что получилось как то не адыкватно открывается медленно очень !
Вот скомпилированный файл и весь проэкт !
Помогите пожалуйста разобраться !

С Уважением Евгений
Вложения
Тип файла: rar Project1.rar (265.3 Кбайт, 5 просмотров)
Тип файла: rar Daewoo.rar (745.9 Кбайт, 7 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:18.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025