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 |
|||
Вот например :
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 минуту
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 минуты
1 |
1 / 1 / 0 Регистрация: 31.03.2012 Сообщений: 13 |
|
01.04.2012, 00:04 [ТС] |
6 |
спасибо, вроде бы ещё помню, что к чему). Но задача у программы которую пишу — специфическая, поэтому я и подставляю 00 впереди. Приведу пример: вот исходная строчка из файла, в ней заложено слово «Конст»: С английскими символами же всё впорядке, вот исходная строка Как считать и перевести обратно русские символы? или желательно универсальный перевод с 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 Character.UnicodeBlock CYRILLIC Добавлено через 30 секунд
0 |
252 / 138 / 45 Регистрация: 19.03.2012 Сообщений: 314 Записей в блоге: 2 |
|
01.04.2012, 14:36 |
11 |
d4hl, мужик, ты уже определись какую кодировку ты будешь для текста использовать. ANSCII или Unicode? Добавлено через 11 минут
1 |
d4hl 1 / 1 / 0 Регистрация: 31.03.2012 Сообщений: 13 |
||||
01.04.2012, 14:52 [ТС] |
12 |
|||
исходя из инфы с этого сайта http://www.fileformat.info/inf… /index.htm, следовало быть unicode… Добавлено через 7 минут
Как теперь реализовать обратный перевод?
0 |
Andretti 252 / 138 / 45 Регистрация: 19.03.2012 Сообщений: 314 Записей в блоге: 2 |
||||
01.04.2012, 19:09 |
13 |
|||
вот для перевода из hex в Unicode, но для отображения в memo тебе придеться делать еще и перевод из unicode в ANSCII. Зачем тебе столько гемороя я просто не представляю.. Чем тебя сразу работа с ANSCII не устроила я не знаю.. Ну дело твое, конечно.
0 |
d4hl 1 / 1 / 0 Регистрация: 31.03.2012 Сообщений: 13 |
||||
01.04.2012, 20:17 [ТС] |
14 |
|||
блин то ли я дурак, то ли сани нифига не едут) Объясню по-другому. Вот форма, ввели англ символы, нажали button1 — получили код: ввели русские символы, нажали button1 — получили код: Теперь в edit3 по нажатию второй кнопки надо декодировать текст из edit2 в первоначальное значение (такое как в edit1). Вот unit
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
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.
answered Mar 4, 2011 at 4:24
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
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.
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
… (продолжение следует) …
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Преобразовать Hex в String
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Junior Рейтинг (т): нет |
Здравствуйте, подскажите пожалуйста, как можно преобразовать Hex в String?
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. |
Демо |
|
Цитата Serega_ @ 24.05.09, 13:54 Здравствуйте, подскажите пожалуйста, как можно преобразовать Hex в String? HEX — это и есть строчное отображение числа. Есть функции IntToHex и StrToInt.
var s: String; i: Integer; begin s := ‘$A0’; i := StrToInt(s); ShowMessage(IntToHex(i,2)); |
Serega_ |
|
Junior Рейтинг (т): нет |
Демо
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. не знаю, грамотно или нет сделал, но работает… |
vitya |
|
У самого такая задача встала ну её я решил А вот как сделать перевод в десятичную и его сложить с десятичной вот это не пойму begin s:=r1+r2 label1.Caption := FloatToStr(s); end; Сообщение отредактировано: vitya — 25.05.09, 17:18 |
leo |
|
Цитата vitya @ 25.05.09, 17:16 У самого такая задача встала ну её я решил Это не та задача В Hex-виде можно представлять не только числа, но и символы произвольной строки — собственно это автор топика и делает, т.е. преобразует строку, скажем ‘0012’ в последовательность Hex-символов ’30 30 31 32′. Если же рассматривать ‘0012’ как Hex-число $0012 и преобразовать его к десятичному виду, то получится ’18’. Цитата vitya @ 25.05.09, 17:16 А вот как сделать перевод в десятичную и его сложить с десятичной вот это не пойму Как ты говоришь «все значительно проще»
//Если десятичное число в Edit2 — целое label1.Caption:=IntToStr(StrToInt(‘$’+Edit1.Text)+StrToInt(Edit2.Text)); //Если десятичное число в Edit2 может быть вещественным label1.Caption:=FloatToStr(StrToInt(‘$’+Edit1.Text)+StrToFloat(Edit2.Text)); |
vitya |
|
leo |
Serega_ |
|
Junior Рейтинг (т): нет |
Здравствуйте, возникла проблемка, т.е. если читаю взятые из реестра значения REG_MULTI_SZ, то цифры и английские буквы читаются правильно, а если попадается русские буквы, то замес-то них, появляются разные символы… Пример: |
andrew.virus |
|
Цитата Serega_ @ 28.05.09, 20:17 Здравствуйте, возникла проблемка, т.е. если читаю взятые из реестра значения REG_MULTI_SZ, то цифры и английские буквы читаются правильно, а если попадается русские буквы, то замес-то них, появляются разные символы… Пример: всё объясняется тем, что значения в реестре хранятся как UNICODE-данные и потому, чтобы русский текст выглядел нормально после преобразования HEX-значения найденное значение нужно перевести в кодировку ANSI, например, используя методы описанные в этой теме … з.ы.: данные для перобразования преобразуются локально, используя TUnicodeStrings, как обычный тип TStrings но при применении методов отражения в нужную кодировку …. Сообщение отредактировано: andrew.virus — 28.05.09, 20:46 |
Serega_ |
|
Junior Рейтинг (т): нет |
andrew.virus |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ 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«85A74¬@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.