|
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/ англоязычный (здавствуй КЭП, как говориться Добавлено через 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 У самого такая задача встала ну её я решил
Это не та задача Цитата 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.






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