Hex to word delphi

1 / 1 / 0

Регистрация: 31.03.2012

Сообщений: 13

1

31.03.2012, 04:30. Показов 44198. Ответов 17


Студворк — интернет-сервис помощи студентам

Доброго времени суток. Прошу помощи в решении задачи: в edit вводим текст к примеру «Конст», по нажатию button1 в edit2 переводит текст в hex (пример из онлайн переводчика %41a%43e%43d%441%442), по нажатию button2 в edit2 переводит значение из hex’a в текст.



0



Andretti

252 / 138 / 45

Регистрация: 19.03.2012

Сообщений: 314

Записей в блоге: 2

31.03.2012, 07:30

2

Вот например :

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
unit Unit1;
 
interface
 
uses
  SysUtils, Classes, Controls, Forms, StdCtrls;
 
type
  TForm1 = class(TForm)
    btn1: TButton;
    edt1: TEdit;
    edt2: TEdit;
    btn2: TButton;
    edt3: TEdit;
    function StrToHex(source: string): string;
    function HexToStr(hex: string): string;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{функция преоброзования строки -> HEX }
function TForm1.StrToHex(source: string): string;
var
  i: Integer;
  c: Char;
  s: string;
begin
  s := '';
  for i:=1 to Length(source) do begin
    c := source[i];
    s := s +  IntToHex(Integer(c), 2) + ' ';
  end;
  result := s;
end;
 
{функция преоброзования HEX -> строка}
function TForm1.HexToStr(hex: string): string;
var
  i: Integer;
begin
  hex:= StringReplace(hex, ' ', '', [rfReplaceAll]);
  for i:= 1 to Length(hex) div 2 do
    Result:= Result + Char(StrToInt('$' + Copy(hex, (i-1) * 2 + 1, 2)));
end;
 
procedure TForm1.btn1Click(Sender: TObject);
begin
  edt2.Text := StrToHex(edt1.Text);
end;
 
procedure TForm1.btn2Click(Sender: TObject);
begin
  edt3.Text:= HexToStr(edt2.Text);
end;
 
end.



2



252 / 138 / 45

Регистрация: 19.03.2012

Сообщений: 314

Записей в блоге: 2

31.03.2012, 07:41

3

Кстати говоря слово «Конст» в 16-ричном коде будет выглядить так : «CA EE ED F1 F2». Можешь проверить в любом hex-редакторе. )



0



1 / 1 / 0

Регистрация: 31.03.2012

Сообщений: 13

31.03.2012, 17:25

 [ТС]

4

Спасибо огромное, и прошу прощения за отнятое время… но тысяча чертей, видимо я не правильно выразился. Вообщем есть файл, с него построчно читается hex, вот пример строки: 041a043e043d04410442 (так выглядит слово «Конст»). Ещё допустим слово «privet» (так оно будет выглядить после перевода: 007000720069007600650074).

Ещё раз приношу извинения, за не правильность толкования задачи, просто с таким столкнулся впервые, задача специфическая.

Вот пример транслятора… http://centricle.com/tools/ascii-hex/

Добавлено через 31 минуту
upd/ Немного изменил строчку из StrHex c s := s + IntToHex(Integer(c), 2) + ‘ ‘;
на s := s +’00’+IntToHex(Integer(c), 2); практически, перевод как в трансляторе (Англ символы),но осталась задача как перевести русские символы по примеру транслятора?



0



252 / 138 / 45

Регистрация: 19.03.2012

Сообщений: 314

Записей в блоге: 2

31.03.2012, 21:59

5

Во-первых слово «Конст» в 16-ричном коде будет выглядить так : «CA EE ED F1 F2» и никак иначе. Сайт который ты используешь — http://centricle.com/tools/ascii-hex/ англоязычный (здавствуй КЭП, как говориться :-) ). А раз англоязычный то и международную таблицу кодировки символов (таблицу ANSCII) они используют для английского языка. В таблице ANSCII с 0 по 127 код идут печатуемые и не печатуемые символы клавиатуры и латинские буквы. Начиная со 128 кода и далее идут символы языка той страны в котрой она используеться (в нашем случае русские символы), а значит переводчик с этого сайта о них ничего не знает, ведь если бы ты был из китая, то код символ таблицы ANSCII под кодом 128 отличался бы от нашего русского, хотя номер кода один и тот же. Если не веришь, то проверь на практике — попробуй перевести на этом сайте любое русское слово в hex-код, а затем обратно в нормальный читаемы вид. Ты никогда не получишь исходного русского слова, даю гарантию в 100%. Если ты хочешь проверить правильность перевода любого русского слова в hex-код, то воспользуйся любой программой на своем компьютере типа WinHEX. Во-вторых никаких двойных нолей вставлять в HEX код не нужно. Из курса информатики мы помним, что каждый символ в комьютере представляеться в виде 8битного (8 цифр) двоичного кода, что соответствует двум цифрам 16-ричного кода (по 4 бита на одну цифру). То есть каждый символ в 16ричном коде представляеться двумя цифрами а не четырмя (то есть например 43 а не 00 43).

Добавлено через 2 минуты
Кстати, символ «%» который выдает переводчик на этом сайте это условное обочначение условного пробела (или как на самом деле пустого места, так как 16ричный код идет подряд без всяких пробелов).



1



1 / 1 / 0

Регистрация: 31.03.2012

Сообщений: 13

01.04.2012, 00:04

 [ТС]

6

спасибо, вроде бы ещё помню, что к чему). Но задача у программы которую пишу — специфическая, поэтому я и подставляю 00 впереди. Приведу пример: вот исходная строчка из файла, в ней заложено слово «Конст»:
1a04 3e04 3d04 4104 4204
Для того, чтобы считать с неё данные мне надо попарно менять местами 2 символа. Вот как выглядит после преобразования. А теперь если написать слово «Конст» в онлайн трансляторе, выше ссылка, то будет вот такое чудо, только в трасляторе нули заменяются %:
041a 043e 043d 0441 0442

С английскими символами же всё впорядке, вот исходная строка
6200 7500 6700 6100 6700
Меняем попарно
0062 0075 0067 0061 0067
И обрабатываем кодом который вы написали выше, всё работает на ура.

Как считать и перевести обратно русские символы? или желательно универсальный перевод с rus на rus и с eng на eng



1



252 / 138 / 45

Регистрация: 19.03.2012

Сообщений: 314

Записей в блоге: 2

01.04.2012, 08:23

7

В трансляторе на том сайте знак % это не замена нуля. Еще раз повторяюсь — 041a 043e 043d 0441 0442 — это не слово «Конст»! Ни в каком виде! ты разве не прочитал что я написал тебе выше? 041a 043e 043d 0441 0442 — этот код ты не переведешь тем же самым транслятором сайта. Ты можешь понять, что этот сайт не правильно переводит русский текст?



1



1 / 1 / 0

Регистрация: 31.03.2012

Сообщений: 13

01.04.2012, 12:41

 [ТС]

8

я понял, дисскусировать не стану, т.к я не асс в программировании, поэтому и прошу помощи. С помощью гугла нашёл такую вещь http://www.fileformat.info/inf… /index.htm, просто вбил 041a, вот что выдал поиск Unicode Character ‘CYRILLIC CAPITAL LETTER KA’ (U+041A), UTF-16 (hex) 0x041A (041a), ну и так далее буква «о» — UTF-16 (hex) 0x041E (041e). Есть идеи?)



0



252 / 138 / 45

Регистрация: 19.03.2012

Сообщений: 314

Записей в блоге: 2

01.04.2012, 13:14

9

Так… походу мы друг друга совсем не понимаем.. Что ты прицепился к этому 041a? это ведь неправильный код буквы «К» который тебе выдал тот сайт. Блин, скачай ты себе WinHex и переводи с помошью его любой текст (русский или английский) в hex код. И хватит уже пытаться получить перевод русского текста в hex-код на англоязычных сайтах.



0



1 / 1 / 0

Регистрация: 31.03.2012

Сообщений: 13

01.04.2012, 14:08

 [ТС]

10

пусть тот сайт выдал неправильный, это————> уже совсем другой http://www.fileformat.info/inf… /index.htm, который я нагуглил. Как быть с такой кодировкой?

Добавлено через 19 минут
если что, ниже на этом сайте

Java Data
string.toUpperCase()
Н
string.toLowerCase()
н

Character.UnicodeBlock

CYRILLIC

Добавлено через 30 секунд
это 043d



0



252 / 138 / 45

Регистрация: 19.03.2012

Сообщений: 314

Записей в блоге: 2

01.04.2012, 14:36

11

d4hl, мужик, ты уже определись какую кодировку ты будешь для текста использовать. ANSCII или Unicode?

Добавлено через 11 минут
d4hl, Прошу понять, что русский текст в кодировке ANSCII имеет один код а в Unicode другой и соответственно будут разные их представления в HEX. Вы сначала определитесь для какой кодировки требуется написать программу.



1



d4hl

1 / 1 / 0

Регистрация: 31.03.2012

Сообщений: 13

01.04.2012, 14:52

 [ТС]

12

исходя из инфы с этого сайта http://www.fileformat.info/inf… /index.htm, следовало быть unicode…

Добавлено через 7 минут
проблема решена частично нашёл вот такую штуку

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure tform1.button1click(sender: tobject);
var
strsource,strdest:string;
i:integer;
tmp:widestring;
begin
strsource := memo1.text;
tmp:=strsource;
strdest:='';
for i:=1 to length(tmp) do
strdest:=strdest+'<'+inttohex(integer(tmp[i]),4)+'>';
memo2.text := strdest;
end;

Как теперь реализовать обратный перевод?



0



Andretti

252 / 138 / 45

Регистрация: 19.03.2012

Сообщений: 314

Записей в блоге: 2

01.04.2012, 19:09

13

вот для перевода из hex в Unicode, но для отображения в memo тебе придеться делать еще и перевод из unicode в ANSCII. Зачем тебе столько гемороя я просто не представляю.. Чем тебя сразу работа с ANSCII не устроила я не знаю.. Ну дело твое, конечно.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function hexTOunicode (source:string):string;
var S,unicod: string;
t: Integer;
begin
unicod:='';
with TStringList.Create do
try
   Text := StringReplace(Source, #32, #13#10, [rfReplaceAll]);
   S := '';
   for t := 0 to Count - 1 do
     S := S + Chr(StrToInt('$' + Strings[t]));
   unicod:=unicod+s;
finally
   Free;
end;
 Result:=unicod;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var text:string;
begin
 strsource := memo2.text;
 tmp:=strsource;
 strdest:='';
 for i:=0 to (length(tmp) div 6)-1 do
 text:=hexTOunicode(copy(tmp,(2+i*6),4));
 
end;



0



d4hl

1 / 1 / 0

Регистрация: 31.03.2012

Сообщений: 13

01.04.2012, 20:17

 [ТС]

14

блин то ли я дурак, то ли сани нифига не едут) Объясню по-другому. Вот форма, ввели англ символы, нажали button1 — получили код:

ввели русские символы, нажали button1 — получили код:

Теперь в edit3 по нажатию второй кнопки надо декодировать текст из edit2 в первоначальное значение (такое как в edit1).

Вот unit

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
strsource,strdest:string;
i:integer;
tmp:widestring;
begin
strsource := Edit1.Text;
tmp:=strsource;
strdest:='';
for i:=1 to length(tmp) do
strdest:=strdest+''+inttohex(integer(tmp[i]),4)+' ';
Edit2.text := strdest;
end;
 
end.



0



252 / 138 / 45

Регистрация: 19.03.2012

Сообщений: 314

Записей в блоге: 2

01.04.2012, 23:17

15

d4hl, Короче вот тебе две проги с исходниками — первая переводит текст по кодировке ANSCII в HEX и обратно в текст по ANSCII. Вторая переводит введенный текст по кодировке Unicode в HEX а потом опять в текст по таблице UNICODE.



3



1 / 1 / 0

Регистрация: 31.03.2012

Сообщений: 13

01.04.2012, 23:46

 [ТС]

16

спасибо о великий мастер за время потраченное и помощь!



0



252 / 138 / 45

Регистрация: 19.03.2012

Сообщений: 314

Записей в блоге: 2

02.04.2012, 00:43

17

Да ладно тебе, мы просто долго пытались понять друг друга )). Потребуеться помощь, пиши.



0



0 / 0 / 0

Регистрация: 12.08.2016

Сообщений: 4

24.08.2016, 12:32

18

Andretti, спасибо за код! Кнопку «спасибо» не нашёл, поэтому благодарю через сообщение!



0



I have some data formatted in hex (stored in byte) that i need to convert to string, the data should be like this

13 61 23 45 67 8F FF

and expected output

13612345678FFF

i know Chr() or IntToStr() function will not work since this data not actual hex code but string/number formatted in hex, so anyone has some suggestion for this?

asked Mar 4, 2011 at 3:54

Dels's user avatar

This is for converting a dynamic array of bytes to a hex string:

function BytesToHex(aSource: TBytes): string;
begin
  SetLength(Result, Length(aSource) * 2);
  if Length(aSource) > 0 then
    BinToHex(aSource[0], PChar(Result), Length(aSource));
end;

If your source bytes are not in a dynamic array, you’ll have to adjust the code slightly, but it should give you a general idea of how to do it.

Peter's user avatar

answered Mar 4, 2011 at 4:24

Thorsten Engler's user avatar

6

With the example that you’ve provided, why don’t you just remove the spaces?

s := '13 61 23 45 67 8F FF';

stripped := StrUtils.ReplaceStr(s,' ','');

if your hex string is not too long, you can get it as a number like this:

MyInt64 := StrToInt64('$' + stripped);

Check out HexToBin() if you want to get your hex string as an array of bytes.

answered Mar 4, 2011 at 5:22

Wouter van Nifterick's user avatar

2

 
Al1
 
(2004-11-21 18:35)
[0]

Мастера подскажите пожалуйста как из Hex переводить в String и наоборот. Есть у меня например некая последовательность байт: Buf: array of Byte

мне надо етот Buf перевести в строку, содержашую его HEX формат
s : string , где длина строки получиться равной длине Buf * 2 и обратно!

Может есть некие компоненты, с помошью которых можно было бы легко оперировать с HEX?


 
Pat ©
 
(2004-11-21 18:40)
[1]

См функцию format()


 
al1
 
(2004-11-21 18:56)
[2]


> Pat

И как мне с ней работать? помоему format не будет решением [0]


 
Anatoly Podgoretsky ©
 
(2004-11-21 19:08)
[3]

Al1   (21.11.04 18:35)  
Нет необходимости, Hex уже String, соответственно и наоборот.
Но в самой теме почему то уже говоришь про байты.


 
begin…end ©
 
(2004-11-21 19:12)
[4]


> [2] al1   (21.11.04 18:56)

А работать так: Format(«%x», [IntegerValue]).


 
SergP ©
 
(2004-11-21 19:22)
[5]


> Мастера подскажите пожалуйста как из Hex переводить в String
> и наоборот.

1.) Из HEX в String (вернее из integer, byte и других целочисленных типов в string в HEX формате)
 a) function IntToHex(Value: Integer; Digits: Integer): string;
 b) format (уже в предідущих постах объяснили)

2.) Обратно
  function StrToInt(const S: string): Integer;

пример:   MyInteger:=StrToInt(«$»+MyString);


 
palva ©
 
(2004-11-21 19:25)
[6]

где длина строки получиться равной длине Buf * 2 и обратно

Ага, кажется, я понял. Каждый байт нужно представить в виде двух шестнадцатиричных цифр. Тогда можно так:

s := «»;
for i := 0 to …
begin
 s := s + IntToHex(Buf[i])
end


 
Anatoly Podgoretsky ©
 
(2004-11-21 19:27)
[7]

palva ©   (21.11.04 19:25) [6]
Хоть бы не приводил ошибочного кода


 
palva ©
 
(2004-11-21 19:29)
[8]

Я не прав, не
IntToHex(Buf[i])
а как написал SergP
IntToHex(Buf[i], 2)
Хотя тут тоже проблема с ведущим нулем. Наверно без Format здесь не обойтись, хотя лично я написал бы непосредственно преобразование


 
al1
 
(2004-11-21 19:29)
[9]

нет мне надо чуть другое:
есть у меня Buf: array of Byte, в котором имееться 6 байт: 6D6F757365 а мне надо например в s:String получить из етого слово mouse и в SHex: string получить «6D6F757365». (ы у меня получиться длиной в 5 символов а SHex длиной в 10 символов)

Т.е мне надо знать как мне можно конвертировать из Buf в String и в StringinHex и наоборот!


 
begin…end ©
 
(2004-11-21 19:34)
[10]


> [9] al1   (21.11.04 19:29)

Чего-то у тебя не так в консерватории, где там 6 байт, я только 5 вижу.


 
begin…end ©
 
(2004-11-21 19:36)
[11]


> [9] al1   (21.11.04 19:29)

Ну а вообще обрабатывай строку в цикле, по 2 символа, каждый кусочек переводи в Byte с помощью StrToInt, а потом можно получить символ, соответствующий этому коду, с помощью Chr().


 
KilkennyCat ©
 
(2004-11-21 19:36)
[12]


> begin…end ©   (21.11.04 19:34) [10]

у него впереди 00 :)


 
al1
 
(2004-11-21 19:36)
[13]


> begin…end ©   (21.11.04 19:34) [10]

опечатался:
Buf — 5 байт
и вместо ы я имел ввиду S:
(S у меня получиться длиной в 5 символов а SHex длиной в 10 символов)


 
begin…end ©
 
(2004-11-21 19:39)
[14]


> [11] begin…end ©   (21.11.04 19:36)

Нет, это я не то сказал. У тебя же изначально есть массив, вот для каждого элемента вызывай функцию Chr(), получишь соответствующий символ; а также для каждого элемента вызывай IntToHex() или Format(), получишь шестнадцатеричное представление байта; ну и так для всех элементов.


 
Palladin ©
 
(2004-11-21 19:48)
[15]

чего вы к парню пристали? просто скажите ответ и все :)


 
begin…end ©
 
(2004-11-21 20:23)
[16]


> al1

var
 Buf: array of Byte;
 S, SHex: String;
 I: Integer;

begin
 S := "";
 SHex := "";
 for I := Low(Buf) to High(Buf) do
 begin
   S := S + Chr(Buf[I]);
   SHex := SHex + Format("%x", [Buf[I]])
 end
end.


 
SergP ©
 
(2004-11-21 20:30)
[17]

Что-то типа этого, чтоли?

function HerZnaetChtoToString(var MyBuf:TMyArray ):string;
var
 i:integer;
begin
 setlength(result,High(MyBuf)-Low(MyBuf)+1);
 for i:=low(MyBuf) to High(MyBuf) do
 result[i-low(MyBuf)+1] := chr(MyBuf[i]);
end;

В работе не пробовал. Мог и ошибиться где-нить….


 
SergP ©
 
(2004-11-21 20:32)
[18]

А… Ну да.. Про SHEX еще забыл… Но

> begin…end ©   (21.11.04 20:23) [16]

тебе уже раньше меня ответил…


 
Anatoly Podgoretsky ©
 
(2004-11-21 20:33)
[19]

Palladin ©   (21.11.04 19:48) [15]
Мягкая завуалированая форма — код давай.


 
SergP ©
 
(2004-11-21 20:52)
[20]


>palva ©   (21.11.04 19:29) [8][Ответить]
> Хотя тут тоже проблема с ведущим нулем.

В IntToHex нет проблемы с ведущим нулем.


 
al1
 
(2004-11-21 21:06)
[21]

Спасибо.

> begin…end

А можешь еще подсказать кодом на обратный процесс?
(Из String в Buf)


 
begin…end ©
 
(2004-11-21 21:16)
[22]


> [21] al1   (21.11.04 21:06)


> А можешь еще подсказать кодом на обратный процесс?
> (Из String в Buf)

Из какого String — из S или SHex?


 
begin…end ©
 
(2004-11-21 21:36)
[23]


> al1

Если ты имеешь в виду SHex, то тогда можно так:

var
 Buf: array of Byte;
 SHex: String;
 I, Len: Integer;

begin
 // SHex := "6D6F757365";
 Len := Length(SHex);
 if (Len > 0) and (Len mod 2 = 0) then
 begin
   SetLength(Buf, Len div 2);
   I := 0;
   while (I <= High(Buf)) do
   begin
     Buf[I] := StrToInt("$" + Copy(SHex, I * 2 + 1, 2));
     Inc(I)
   end
 end
end.

Работает, но насчёт оптимальности — не знаю… Хочу спать, соображаю плохо…

P.S. Люблю Балтику 7.


 
al1
 
(2004-11-21 21:42)
[24]

Спасибо. Вроде бы работает!
Такой вопрос:
while (I <= High(Buf)) do

а как выставить сразу нужный размер Buf?


 
begin…end ©
 
(2004-11-21 21:46)
[25]


> [24] al1   (21.11.04 21:42)


> а как выставить сразу нужный размер Buf?

Нужный размер Buf выставляется в строке: «SetLength(Buf, Len div 2);».

P.S. Можно даже Балтику 3.


 
begin…end ©
 
(2004-11-21 22:01)
[26]


> al1

Цикл while можно и на for заменить, т.е. вместо этого:

I := 0;
while (I <= High(Buf)) do
begin
 Buf[I] := StrToInt("$" + Copy(SHex, I * 2 + 1, 2));
 Inc(I)
end

можно так:

for I := 0 to High(Buf) do
 Buf[I] := StrToInt("$" + Copy(SHex, I * 2 + 1, 2))


 
begin…end ©
 
(2004-11-21 22:10)
[27]

Мда… Не видать мне пива… :-(


 
al1
 
(2004-11-21 22:12)
[28]


> Мда… Не видать мне пива… :-(

Разве что по почте! Страна? Город? :-)


 
Palladin ©
 
(2004-11-21 22:12)
[29]

Нет, не видать. Вряд ли он настолко толстые тонкие намеки понимает :) Он себя то понять не может…


 
al1
 
(2004-11-21 22:17)
[30]


> Он себя то понять не может…

Я еще не до такой степени напился чтоб себя не понимать! :-)

А вот насчет конвертирования Hex в строку и наоборот — перерыл кучу документации… везде в скольз ето обьясняеться… толком без примеров… и мало чего понятно :-( Может кто-то подскажет где мне про ето все хорошенько почитать? Буду благодарен! :-)


 
begin…end ©
 
(2004-11-21 22:18)
[31]


> [30] al1   (21.11.04 22:17)

Теперь все советы только после полной предоплаты :-)


 
Palladin ©
 
(2004-11-21 22:19)
[32]

Ты сначала подумай, а что такое HEX?


 
al1
 
(2004-11-21 22:23)
[33]


> Palladin ©   (21.11.04 22:19) [32]
> Ты сначала подумай, а что такое HEX?

16-ти разрядное представление данных.
Диапазон от 0х00 до 0хFF
(если в int, то от 0 до 255)


 
Palladin ©
 
(2004-11-21 22:30)
[34]

Во-первых никакое это не 16-ти разрядное представленние данных. Это представления числа в 16-ричной системе исчисления. 16-ти разрядное представление это когда цифра 3 записывается в 16 разрядах чего либо. Например
0000000000000003
или
0000000000000101

Ключевой момент «представление». Представлять может только человек. Для стандартного процессора это выглядит как «есть, нет». Ему до фени какое то там 16-ти разрядное представление, представление в 16-тиричной системе исчисления. Вас в школе не учили как переводить из одной системы исчисления в другую разве?


 
al1
 
(2004-11-21 22:36)
[35]


> Вас в школе не учили как переводить из одной системы исчисления
> в другую разве?

Еще как учили! Догнали и еще раз научили! :-)


> Например
> 0000000000000003
> или
> 0000000000000101

Это двоичное представление данных! :-)
3 в integer — ето 0х03 в Hex


 
Palladin ©
 
(2004-11-21 22:40)
[36]

это я тебе показал, что такое 16-ти разрядность, и первое представоение это не двоичное представление… это сколькоугодноичное (больше трех)… но оба этих представления 16-тиразрядные

а что такое integer, можешь мне сказать?


 
al1
 
(2004-11-22 00:14)
[37]


> а что такое integer, можешь мне сказать?

Конечно могу:
Целочисленый тип integer… Диапазон -2147483648..2147483647… Переменная типа Integer занимает в памяти 4 байта (32 бита) … Ее битовый формат: самый старший бит — знак числа, остальные биты (31 штука) — само число.


 
Palladin ©
 
(2004-11-22 00:18)
[38]

Вот именно. Integer — это тип, описывающий переменную, а Hex — это представление показывающее переменную. Между ними нет никакой связи. Теперь что такое String?


 
Ken
 
(2004-11-22 09:31)
[39]


> Теперь что такое String?

тип, описывающий строковую переменную


 
Ken
 
(2004-11-22 09:46)
[40]

Ув. мастера, подкиньте пожалуйста пару ссылок на доки где про ето можно прочитать хорошенько! Тоже интересно разобраться!
Спасибо.


 
Rutven ©
 
(2004-11-22 10:26)
[41]

Что вы мучаетесь.
Есть же замечательные функции в Delphi — BinToHex и HexToBin.
Всё замечательно работает.


 
Al1
 
(2004-11-22 14:37)
[42]


> Есть же замечательные функции в Delphi — BinToHex и HexToBin.

Мне надо строку в Hex а не BinToHex


 
Anatoly Podgoretsky ©
 
(2004-11-22 15:40)
[43]

Еще раз ХЕКС уже строка


 
Al1
 
(2004-11-22 15:54)
[44]


> Anatoly Podgoretsky ©   (22.11.04 15:40) [43]
> Еще раз ХЕКС уже строка

и?

var buf : array of byte;
   s : string;
Buf := s; ???

как перевести?


 
Anatoly Podgoretsky ©
 
(2004-11-22 16:01)
[45]

Уже перевел, но только строку в массив байтов, если конечно компилятор не обругает.


 
Al1
 
(2004-11-22 16:21)
[46]

Хорошо а как узнать по символу его код?
(обратный процесс ф-ции Chr)


 
begin…end ©
 
(2004-11-22 16:23)
[47]


> [46] Al1   (22.11.04 16:21)

> Хорошо а как узнать по символу его код?


Ord()


 
Al1
 
(2004-11-22 17:13)
[48]

Уважаемые мастера, вроде получился у меня какойто результат:

type ArrayOfByte = array of byte;

implementation

{$R *.dfm}

function Hex2StrHex (Buf : array of byte; BufLength : integer):String;
var i : integer;
begin
Result := "";
for I := 1 to BufLength do
begin
  Result := Result + Format("%x", [Buf[I]])
end;
end;

function Hex2Str (Buf : array of byte; BufLength : integer):String;
var i : integer;
begin
Result := "";
for I := 1 to BufLength do
begin
  Result := Result + Chr(Buf[I]);
end;
end;

function StrHex2Hex (SHex : string; SHexLength : integer):ArrayOfByte;
var
I: Integer;

begin
if (SHexLength > 0) and (SHexLength mod 2 = 0) then
begin
  SetLength(Result, SHexLength div 2);
  for I := 0 to High(Result) do
  Result[I] := StrToInt("$" + Copy(SHex, I * 2 + 1, 2));
end;
end;

function Str2Hex (S : string; SLength : integer):ArrayOfByte;
var
I: Integer;

begin
if (SLength > 0) then
begin
  SetLength(Result, SLength);
  for I := 0 to High(Result) do
  Result[I] := Ord(S[i+1]);
end;
end;

Проверьте пожалуйста, может чтото не так?

И еще вопросик: а как обьявить function (): array of byte, не обьявляя новый тип: type ArrayOfByte = array of byte ???

Заранее спасибо.


 
begin…end ©
 
(2004-11-22 17:22)
[49]


> [48] Al1   (22.11.04 17:13)

А зачем в функции передавать длины массивов и строк, когда их (длины) можно определять внутри функций?


 
Al1
 
(2004-11-22 17:28)
[50]


> begin…end ©   (22.11.04 17:22) [49]
>
> > [48] Al1   (22.11.04 17:13)
>
> А зачем в функции передавать длины массивов и строк, когда
> их (длины) можно определять внутри функций?

на случай универсальности…. вдруг забудешь укоротить строчку, после работы с ней!… или в буфере допустим тебе надо будет скушать и обработать кусок а не весь!… :-)


 
begin…end ©
 
(2004-11-22 17:50)
[51]


> [50] Al1   (22.11.04 17:28)

Зато можно что-то перепутать и передать, например, число, бОльшее, чем вообще возможно. А это уже будет выход за границы.

> [48] Al1   (22.11.04 17:13)


> function Hex2StrHex (Buf : array of byte; BufLength : integer):String;

> for I := 1 to BufLength do


Ошибка. Buf: array of Byte — это ОТКРЫТЫЙ массив. Для них, как и для динамических, нумерация элементов начинается с нуля. Здесь, ИМХО, лучше заменить array of byte на уже объявленный тобой тип — динамический массив — ArrayOfByte. Но нижний индекс всё равно будет равен нулю, так что советую здесь вместо 1 и BufLength использовать Low(Buf) и High(Buf).


 
Al1
 
(2004-11-22 18:01)
[52]


> begin…end ©   (22.11.04 17:50) [51]

Понятно! Буду иметь ввиду! Спасибо.


В следующей статье хотел бы рассмотреть простой алгоритм шифрования строк, но прежде хотел поделиться функциями StrToHex и HexToStr для строк в кодировке Unicode. Данные функции конвертируют строку в HEX и обратно из HEX в строку. Как известно, с CodeGear Delphi 2007 начинается эра unicode версии Delphi, из-за этого возникли некоторые нюансы при использовании функций, работающие со строками.

Функция StrToHex — конвертирует строку в HEX

function StrToHex(const source: string): string;
var
  StrAsBytes:TBytes;
  i:cardinal;
begin
  StrAsBytes := TEncoding.UTF8.GetBytes(source);
  for i := 0 to length(StrAsBytes) - 1 do result:=result+IntToHex(StrAsBytes[i], 2);
end;

Функция HexToStr — конвертирует HEX в строку

function HexToStr(const source: string): string;
var
  i, idx:Cardinal;
  StrAsBytes:TBytes;
begin
  SetLength(StrAsBytes, length(source) div 2);
  i:=1;
  idx:=0;
  while i< =length(source) do
  begin
    StrAsBytes[idx]:=StrToInt('$'+source[i]+source[i+1]);
    i:=i+2;
    idx:=idx+1;
  end;
  result:=TEncoding.UTF8.GetString(StrAsBytes);
end;

Использование на примере StrToHex:

HexStr:=StrToHex(SourceStr);

Похожие записи

  • XEBI — простой алгоритм шифрование Unicode строк на Delphi
  • Конвертация Unicode-ответа JSON в Delphi без функции HTMLDecode
  • Hasher — генерация различных типов хешей
function StringToHex(S: String): string;
var I: Integer;
begin
  Result:= '';
  for I := 1 to length (S) do
    Result:= Result+IntToHex(ord(S[i]),2);
end;

function HexToString(H: String): String;
var I: Integer;
begin
  Result:= '';
  for I := 1 to length (H) div 2 do
    Result:= Result+Char(StrToInt('$'+Copy(H,(I-1)*2+1,2)));
end;

или

uses Classes;
 
function HexStrToStr(const HexStr: string): string;
var
  ResultLen: Integer;
begin
  ResultLen := Length(HexStr) div 2;
  SetLength(Result, ResultLen);
  if ResultLen > 0 then
    SetLength(Result, HexToBin(Pointer(HexStr), Pointer(Result), ResultLen));
end;
 
function StrToHexStr(const S: string): string;
var
  ResultLen: Integer;
begin
  ResultLen := Length(S) * 2;
  SetLength(Result, ResultLen);
  if ResultLen > 0 then
    BinToHex(Pointer(S), Pointer(Result), Length(S));
end;
 
const
  CHello: string = 'Hello world';
begin
  Writeln(StrToHexStr(CHello));
  Writeln(HexStrToStr(StrToHexStr(CHello) + '21'));
  ReadLn;
end.

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Преобразовать Hex в String

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    24.05.09, 13:54

      Junior

      *

      Рейтинг (т): нет

      Здравствуйте, подскажите пожалуйста, как можно преобразовать Hex в String?
      Нашёл в интернете код преобразования String в Hex, а вот как преобразовать обратно, не могу сообразить…

      ExpandedWrap disabled

        unit Unit1;

        interface

        uses

          Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

          Dialogs, StdCtrls;

        type

          TForm1 = class(TForm)

            btn1: TButton;

            edt1: TEdit;

            edt2: TEdit;

            function StrToHex(source: string): string;

            procedure btn1Click(Sender: TObject);

          private

            { Private declarations }

          public

            { Public declarations }

          end;

        var

          Form1: TForm1;

        implementation

        {$R *.dfm}

        {функция преоброзования строки -> HEX }

        function TForm1.StrToHex(source: string): string;

        var

          i: Integer;

          c: Char;

          s: string;

        begin

          s := »;

          for i:=1 to Length(source) do begin

            c := source[i];

            s := s +  IntToHex(Integer(c), 2) + ‘ ‘;

          end;

          result := s;

        end;

        procedure TForm1.btn1Click(Sender: TObject);

        begin

          edt2.Text := StrToHex(edt1.Text);

        end;

        end.


      Демо



      Сообщ.
      #2

      ,
      24.05.09, 14:39

        Цитата Serega_ @ 24.05.09, 13:54

        Здравствуйте, подскажите пожалуйста, как можно преобразовать Hex в String?

        HEX — это и есть строчное отображение числа.

        Есть функции IntToHex и StrToInt.

        ExpandedWrap disabled

          var

            s: String;

            i: Integer;

          begin

            s := ‘$A0’;

            i := StrToInt(s);

            ShowMessage(IntToHex(i,2));


        Serega_



        Сообщ.
        #3

        ,
        24.05.09, 14:54

          Junior

          *

          Рейтинг (т): нет

          Демо
          Спасибо, я сделал таким образом:

          ExpandedWrap disabled

            unit Unit1;

            interface

            uses

              SysUtils, Classes, Controls, Forms, StdCtrls;

            type

              TForm1 = class(TForm)

                btn1: TButton;

                edt1: TEdit;

                edt2: TEdit;

                btn2: TButton;

                edt3: TEdit;

                function StrToHex(source: string): string;

                function HexToStr(hex: string): string;

                procedure btn1Click(Sender: TObject);

                procedure btn2Click(Sender: TObject);

              private

                { Private declarations }

              public

                { Public declarations }

              end;

            var

              Form1: TForm1;

            implementation

            {$R *.dfm}

            {функция преоброзования строки -> HEX }

            function TForm1.StrToHex(source: string): string;

            var

              i: Integer;

              c: Char;

              s: string;

            begin

              s := »;

              for i:=1 to Length(source) do begin

                c := source[i];

                s := s +  IntToHex(Integer(c), 2) + ‘ ‘;

              end;

              result := s;

            end;

            {функция преоброзования HEX -> строка}

            function TForm1.HexToStr(hex: string): string;

            var

              i: Integer;

            begin

              hex:= StringReplace(hex, ‘ ‘, », [rfReplaceAll]);

              for i:= 1 to Length(hex) div 2 do

                Result:= Result + Char(StrToInt(‘$’ + Copy(hex, (i-1) * 2 + 1, 2)));

            end;

            procedure TForm1.btn1Click(Sender: TObject);

            begin

              edt2.Text := StrToHex(edt1.Text);

            end;

            procedure TForm1.btn2Click(Sender: TObject);

            begin

              edt3.Text:= HexToStr(edt2.Text);

            end;

            end.

          не знаю, грамотно или нет сделал, но работает… :yes:


          vitya



          Сообщ.
          #4

          ,
          25.05.09, 17:16

            У самого такая задача встала ну её я решил
            всё значительне проще
            ———————————————————
            procedure TForm1.Button1Click(Sender: TObject);
            var
            index:Integer;
            begin
            index:=StrToInt(‘$’+Edit1.Text);
            Edit2.Text:=IntToStr(index);
            end;
            ———————————————————
            Всё работает!

            А вот как сделать перевод в десятичную и его сложить с десятичной вот это не пойму :wall:
            может кто подскажет….
            —————————————————-
            procedure TForm1.Button1Click(Sender: TObject);
            var
            r1,r2: real; // слагаемые
            r: real; // вывод
            i:Integer;
            begin
            // получить исходные данные
            r1 := StrToFloat(Edit1.Text);
            r2 := StrToFloat(Edit2.Text);

            begin
            i:=StrToInt(‘$’+ Edit1.Text);
            r:=IntToStr(i);

            s:=r1+r2

            label1.Caption := FloatToStr(s);

            end;
            end.
            ———————————————————-
            Прошу сильно не пинать…..начинающий
            Спасибо!

            Сообщение отредактировано: vitya — 25.05.09, 17:18


            leo



            Сообщ.
            #5

            ,
            26.05.09, 04:50

              Цитата vitya @ 25.05.09, 17:16

              У самого такая задача встала ну её я решил
              всё значительне проще

              Это не та задача ;) В Hex-виде можно представлять не только числа, но и символы произвольной строки — собственно это автор топика и делает, т.е. преобразует строку, скажем ‘0012’ в последовательность Hex-символов ’30 30 31 32′. Если же рассматривать ‘0012’ как Hex-число $0012 и преобразовать его к десятичному виду, то получится ’18’.

              Цитата vitya @ 25.05.09, 17:16

              А вот как сделать перевод в десятичную и его сложить с десятичной вот это не пойму

              Как ты говоришь «все значительно проще» ;)

              ExpandedWrap disabled

                //Если десятичное число в Edit2 — целое

                label1.Caption:=IntToStr(StrToInt(‘$’+Edit1.Text)+StrToInt(Edit2.Text));

                //Если десятичное число в Edit2 может быть вещественным

                label1.Caption:=FloatToStr(StrToInt(‘$’+Edit1.Text)+StrToFloat(Edit2.Text));


              vitya



              Сообщ.
              #6

              ,
              27.05.09, 04:49

                leo
                Спасибо попробую….


                Serega_



                Сообщ.
                #7

                ,
                28.05.09, 20:17

                  Junior

                  *

                  Рейтинг (т): нет

                  Здравствуйте, возникла проблемка, т.е. если читаю взятые из реестра значения REG_MULTI_SZ, то цифры и английские буквы читаются правильно, а если попадается русские буквы, то замес-то них, появляются разные символы… :(
                  В чём может быть проблема?

                  Пример:
                  47,00,42,00,54,00,20,00,20,00,20,00,20,00,2d,00,20,00,34,00,32,00,33,00,30,00,32,00,65,00,33,00,31
                  здесь всё нормально конвертируется как:
                  GBT — 42302e31
                  а вот этот:
                  1f,04,30,04,3c,04,4f,04,42,04,4c,04
                  Должно быть — Память, а отображается — 0 < O B L


                  andrew.virus



                  Сообщ.
                  #8

                  ,
                  28.05.09, 20:44

                    Цитата Serega_ @ 28.05.09, 20:17

                    Здравствуйте, возникла проблемка, т.е. если читаю взятые из реестра значения REG_MULTI_SZ, то цифры и английские буквы читаются правильно, а если попадается русские буквы, то замес-то них, появляются разные символы…
                    В чём может быть проблема?

                    Пример:
                    47,00,42,00,54,00,20,00,20,00,20,00,20,00,2d,00,20,00,34,00,32,00,33,00,30,00,32,00,65,00,33
                    ,00,31
                    здесь всё нормально конвертируется как:
                    GBT — 42302e31
                    а вот этот:
                    1f,04,30,04,3c,04,4f,04,42,04,4c,04
                    Должно быть — Память, а отображается — 0 < O B L

                    всё объясняется тем, что значения в реестре хранятся как UNICODE-данные и потому, чтобы русский текст выглядел нормально после преобразования HEX-значения найденное значение нужно перевести в кодировку ANSI, например, используя методы описанные в этой теме …

                    з.ы.: данные для перобразования преобразуются локально, используя TUnicodeStrings, как обычный тип TStrings но при применении методов отражения в нужную кодировку ….

                    Сообщение отредактировано: andrew.virus — 28.05.09, 20:46


                    Serega_



                    Сообщ.
                    #9

                    ,
                    29.05.09, 14:00

                      Junior

                      *

                      Рейтинг (т): нет

                      andrew.virus
                      Спасибо!
                      Всё, что вы сказали про UNICODE, именно так я и делал, но всё равно отображались непонятные символы…
                      Вчитавшись внимательнее в P.S., нашёл у себя ошибку… Теперь всё нормально работает!
                      Ещё раз спасибо!

                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                      0 пользователей:

                      • Предыдущая тема
                      • Delphi: Общие вопросы
                      • Следующая тема

                      Рейтинг@Mail.ru

                      [ Script execution time: 0,0835 ]   [ 16 queries used ]   [ Generated: 14.04.23, 06:38 GMT ]  

                      Вспомогательные функции, из проектов

                      Пусть на входе есть строка

                      #50#54#51#171#56#53#173#65#55#52#172#64#57#58#59#60#61#62#63#175#176#177#178#179#180#165#166#167#168#169#170#181

                      Строка – > массив байт

                      1

                      2

                      3

                      4

                      5

                      6

                      7

                      8

                      9

                      10

                      11

                      12

                      13

                      14

                      15

                      16

                      17

                      type

                        ArrayOfByte = array of byte;

                      function Str2Hex(s: string): ArrayOfByte;

                      var

                        i: Integer;

                        sLength: Integer;

                      begin

                        sLength := Length(s);

                        if (sLength > 0) then

                        begin

                          SetLength(Result, sLength);

                          for i := 0 to High(Result) do

                            Result[i] := Ord(S[i + 1]);

                        end;

                      end;

                      Получили массив байт

                      (50, 54, 51, 171, 56, 53, 173, 65, 55, 52, 172, 64, 57, 58, 59, 60, 61, 62, 63, 175, 176, 177, 178, 179, 180, 165, 166, 167, 168, 169, 170, 181)

                      Байт -> StrHex (Шестнадцатеричное представление)

                      function ByteToHex(InByte: byte): shortstring;

                      const

                        Digits: array[0..15] of char = ‘0123456789ABCDEF’;

                      begin

                        result := digits[InByte shr 4] + digits[InByte and $0F];

                      end;

                      function Hex2StrHex(aBuf: ArrayOfByte): string;

                      var

                        i: Integer;

                      begin

                        Result := »;

                        for i := Low(aBuf) to High(aBuf) do

                          Result := Result + ByteToHex(aBuf[i]); // Format(‘%x’, [aBuf[i]]) работает не совсем корректно в данном случае, 7 переводит в 7, а не 07

                      end;

                      Шестнадцатеричное представление

                      ‘323633AB3835AD413734AC40393A3B3C3D3E3FAFB0B1B2B3B4A5A6A7A8A9AAB5’

                      Или, расставив пробелы, получим

                      32 36 33 AB 38 35 AD 41 37 34 AC 40 39 3A 3B 3C 3D 3E 3F AF B0 B1 B2 B3 B4 A5 A6 A7 A8 A9 AA B5

                      Шестнадцатеричное представление -> байты

                      1

                      2

                      3

                      4

                      5

                      6

                      7

                      8

                      9

                      10

                      11

                      12

                      13

                      14

                      15

                      16

                      17

                      18

                      19

                      20

                      function StrHex2Hex(sHex: string): ArrayOfByte;

                      var

                        i: Integer;

                        sHexLength: Integer;

                        sHexWithoutSpaces: string;

                      begin

                        sHexWithoutSpaces := »;

                        for i := 1 to Length(SHex) do

                         if SHex[i] <>  ‘ ‘ then

                           sHexWithoutSpaces := sHexWithoutSpaces + SHex[i];

                        sHexLength := Length(sHexWithoutSpaces);

                        if (sHexLength > 0) and (sHexLength mod 2 = 0) then

                        begin

                          SetLength(Result, sHexLength div 2);

                          for i := 0 to High(Result) do

                            Result[i] := StrToInt(‘$’ + Copy(sHexWithoutSpaces, i * 2 + 1, 2));

                        end;

                      end;

                      Получили массив байт

                      (50, 54, 51, 171, 56, 53, 173, 65, 55, 52, 172, 64, 57, 58, 59, 60, 61, 62, 63, 175, 176, 177, 178, 179, 180, 165, 166, 167, 168, 169, 170, 181)

                      Либо есть ещё один вариант, через стандартные функции Delphi

                      function ConvertHexStringToBinary(const strInHex: ansistring; out errorMsg: string): ansistring;

                      var

                        noSpaces: ansistring;

                      begin

                        noSpaces:= LowerCase(AnsiReplaceText(strInHex, ‘ ‘, »));

                        SetLength(Result, Length(NoSpaces) div 2);

                        if (Length(Result) = HexToBin(PChar(noSpaces), PChar(Result), Length(Result))) then

                          errorMsg:= »

                        else

                          errorMsg:= ‘Hex To bin returns a number of converted symbols’;

                      end;

                      Массив байт -> строка

                      function Hex2Str(aBuf: array of byte): string;

                      var

                        i: integer;

                        bufLength: integer;

                      begin

                        bufLength := Length(aBuf);

                        Result := »;

                        for i := 0 to BufLength 1 do

                        begin

                          Result := Result + Chr(aBuf[i]);

                        end;

                      end;

                      Вернулась строка

                      ‘263«85­A74¬@9:;<=>?¯°±²³´¥¦§¨©ªµ’

                      Переведем ее в числовое представление строки

                      function StrToOrdStr(aChrStr: string): string;

                      var

                        i: integer;

                      begin

                        Result := »;

                        for i := 1 to Length(aChrStr) do

                          Result := Result + ‘#’ + IntToStr(Ord(aChrStr[i]));

                      end;

                      Результат

                      ‘#50#54#51#171#56#53#173#65#55#52#172#64#57#58#59#60#61#62#63#175#176#177#178#179#180#165#166#167#168#169#170#181’

                      This entry was posted in Delphi. Bookmark the permalink.

                      Понравилась статья? Поделить с друзьями:
                    • Hex to text in excel
                    • Hide grid in word
                    • Hex in excel for color
                    • Hetman word recovery это
                    • Hetman word recovery скачать бесплатно c ключом на русском