![]() |
|
#1
|
|||
|
|||
![]() Всем привет. 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
|
||||
|
||||
![]() Что не получается?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
![]() Код:
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
|
|||
|
|||
![]() Цитата:
|
#5
|
||||
|
||||
![]() Смотря какие данные читать, прочитай в справке про BlockRead.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
|||
|
|||
![]() Цитата:
![]() В примере был открыт обычный текстовый файл с текстом "Text". |
#7
|
|||
|
|||
![]() Ну и в чем проблема?
Прими то, что любые данные, даже текст, это некоторые числа. Для компьютера они записаны в двоичной системе, но их всегда можно перевести в любую другую систему исчисления. Для файла у тебя 2 варианта. 1. Читать файл как текст и переводить отдельные символы в коды (Ord(S[i]) даст тебе десятичное значение для I-го символа строки S). 2. Читать файл как File Of Byte, например, и переводить значения в соотв. символы (Chr(B[i]) даст тебе символ, соотв. значению в I-ой ячейке некоторого массива байт B). |
#8
|
|||
|
|||
![]() мм.. туговато...
|
#9
|
|||
|
|||
![]() Совет от 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
|
|||
|
|||
![]() Спасибо. Немного понятнее. Сейчас будем пробовать. Надо же и обратный путь проложить.
Нашел вот такой пример Код:
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
|
|||
|
|||
![]() Действительно шедевр....
Распечатай и повесь в сортире. ================================================ Итак, обратная задача- из строки сделать integer Самое умное- использоваь то что изобрели до тебя. См. функцию HexToBin в справке Вот пример ее использования. Код:
var Buf:array[0..15] of byte; HexToBin('ff', @Buf[2], 1); //засылает результат во 2 байт буфера и пишет в буфер. Единственный ее недостаток- непонятно как она это делает. Поэтому привожу свой код (только как иллюстрация) Код:
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; то от его порядкового номера вычитается 48. Это потому что символ '0' занимает 48-ю клетку в таблице кодировки а ему соответствует численное значение 0. и символы '0'..'9' расположены подряд. Аналогично и с символами 'a'..'f' Вот и вся механика. |
#12
|
|||
|
|||
![]() Блин! Функции... Почему они такие непонятные
![]() Я же не запущу ее с кнопки. Читал http://delphi но... там математика. Как мне теперь эту функцию подключить к использованию. Запишем: private function HexToStr(s:string):longword; мм.. что-то совсем туго... Цитата:
|
#13
|
||||
|
||||
![]() Зачем же обязательно в private, можно и в public. Тогда будет доступна из других юнитов, а так правильно.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#14
|
|||
|
|||
![]() Процедуры научился подключать, разобрался, но функции...
![]() мм... учитывая данный пример мне необходимо отправлять данные в переменную "s" два значения (0A) которые будет переведены в функцию и возращены в виде символа в "resultat" s:=edit1.text; memo1.text:=HexToStr; Под вид такого? Последний раз редактировалось Kaktuz, 28.11.2011 в 22:04. |
#15
|
|||
|
|||
![]() Вот Попробывал То что получилось как то не адыкватно открывается медленно очень !
Вот скомпилированный файл и весь проэкт ! Помогите пожалуйста разобраться ! С Уважением Евгений |