Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Unicode в Строку


Страницы:   1 2

Mouserx ©   (2005-02-15 18:06:00) 

Скажите как перевести юникод в строку.
Есть у меня некий блок данных, где каждый байт - буква в формате иникод. Как мне текст из этого блока данных получить в виде строки?


Mouserx   (2005-02-16 15:48:00) [1]

Ну вроде бы все работает:


procedure TForm1.Button1Click(Sender: TObject);
var SHex : String;
   WS : WideString;
   i : integer;
   S : String;
   TempArray : Array of Word;
begin
SHex := '043F04400438043C043504400000';
WS := '';
i := 1;
while (i < Length(SHex) + 1) and (Copy(SHex,i,4) <> '0000') do
begin
WS := WS + WideChar(strtoint('$'+Copy(SHex,i,4)));
i:=i+4;
end;
Form1.Edit1.Text := WideCharToString(Pointer(WS));

S := 'пример';
WS := S;
SHex := '';
SetLength(TempArray, Length(ws)+1);
Move(ws[1], TempArray[0], Length(ws)*2+2);
i := 0;
while i < Length(TempArray) do
begin
SHex := SHex + IntToHex(TempArray[i],4);
i := i+1;
end;
Form1.Edit2.Text := SHex;
end;


Спасибо всем за помошь.


palva   (2005-02-16 14:27:00) [2]

Ошибка:
Move(ws[1], sHex[0], Length(ws)*2+ 2);


palva   (2005-02-16 14:25:00) [3]

Mouserx   (15.02.05 21:09) [10]
Обратно:

uses SysUtils, Dialogs;
var
 sHex: array of Word;
 s: String;
 ws: WideString;
begin
 s := 'Строка';
 ws := s;
 SetLength(sHex, Length(ws)+1);
 Move(ws[1], sHex[0], Length(ws)*2+1);
 ShowMessage(IntToHex(sHex[3], 4));
end.


palva   (2005-02-16 14:12:00) [4]

Mouserx   (15.02.05 21:09) [10]
>И собственно по сабжу.
>Вот например в SHex у меня есть следующее:
>'04 3F 04 40 04 38 04 3C 04 35 04 40 00 00'
>как мне получить из этого нужную строку и наоборот?
>Покажите пожалуйста код. Спасибо.

uses Dialogs;
var
 sHex: array of Word;
 s_new: String;
begin
 SetLength(sHex, 7);
 sHex[0] := $043F;
 sHex[1] := $0440;
 sHex[2] := $0438;
 sHex[3] := $043C;
 sHex[4] := $0435;
 sHex[5] := $0440;
 sHex[6] := $0000;
 s_new := WideString(sHex);
 ShowMessage(s_new);
end.


Mouserx   (2005-02-16 13:04:00) [5]

Есть одна неувязочка по поводу конверации Unicode в SHex

Код:

procedure TForm1.Button1Click(Sender: TObject);
var SHex : String;
   WS : WideString;
   i,len : integer;
   S : String;
begin
SHex := '043F04400438043C043504400000';
WS := '';
i := 1;
while (i < Length(SHex) + 1) and (Copy(SHex,i,4) <> '0000') do
begin
WS := WS + WideChar(strtoint('$'+Copy(SHex,i,4)));
i:=i+4;
end;
Form1.Edit1.Text := WideCharToString(Pointer(WS));

S := 'пример';
SHex := '';
StringToWideChar(S,Pointer(WS),Length(S));
for i := 1 to Length(WS) do SHex := SHex + IntToHex(ord(WS[i]),4);
Form1.Edit2.Text := SHex;
end;


В первом части все отлично работает. получаю я из SHex свое слово "пример". Но вот во второй части вместо первой буквы - '0000'.
И в конце '0000' мне необходимо будет самому добавлять?


Anatoly Podgoretsky   (2005-02-15 22:01:00) [6]

Не прав, она в форме чемодана, одной из трех черепах.


Eraser   (2005-02-15 21:58:00) [7]

Anatoly Podgoretsky ©

Ещё раз благодарю за просветление.
Бывает же так, всю жизнь живёшь и думаешь, что земля круглая, а она оказывается квадратной ))


Anatoly Podgoretsky   (2005-02-15 21:53:00) [8]

Зато были другие, а данная функция существует начиная с Д1


Eraser   (2005-02-15 21:49:00) [9]

Anatoly Podgoretsky ©

В первых версиях паскаля, по-моему вообще не было ф-ии StrToInt, там она как-то подругому называлась... забыл как, но по-другому.


Anatoly Podgoretsky   (2005-02-15 21:48:00) [10]

На книгу не стоит обижаться, там приводятся примеры работы с разными аспектами языка, они даже не обязаны быть рабочими.


Anatoly Podgoretsky   (2005-02-15 21:44:00) [11]

Это появилось в первых версиях паскаля.


Eraser   (2005-02-15 21:43:00) [12]

Запустил делфя- проверил.
Чудеса!!! Работает!

Это наверное появилось в последних версиях делфей...?
Когда я начинал заниматься делфи, тогда 5 версия была, так вот, купил книгу Фаронова (по-моему) для начинающих. Так вот там был в примере описан алгоритм преобразования хексовой строки в целочисленный тип...
С тех пор я пребывал в заблуждении насчёт функции StrToInt...

Спасибо огромное, что открыли глаза!!!


Anatoly Podgoretsky   (2005-02-15 21:36:00) [13]

А проверить религия не позволяет?


Eraser   (2005-02-15 21:35:00) [14]

Anatoly Podgoretsky ©

Вы хотите сказать, что если я напишу

var s: string;
   i: integer;

s:='$A';
i:=strtoint(s);
showmessage(inttostr(i));

У меня вылезит окошко с надписью 10?


Anatoly Podgoretsky   (2005-02-15 21:31:00) [15]

ceaabrc в переводе на человеческий язык равен суффикс


Eraser   (2005-02-15 21:29:00) [16]

Mouserx

В данном случае удобнее работать с буффером, тогда алгоритм Подгородецкого упроститься в 2 раза.


Anatoly Podgoretsky   (2005-02-15 21:29:00) [17]

Не может, но может преобразовывать числа в стандартной хекс нотации Паскаля.
Если не понятно, то в разных языках программирования существует разная нотация для двоичных, восьмеричных и шестнадцатиричных представлений чисел. Для этого используются префиксы или суфиксы, для трех очень растространеных языков это.
C      - префикс 0x
Pascal - префикс $
ASM    - ceaabrc h, число должно начинаться с десятичной цифры


Mouserx   (2005-02-15 21:27:00) [18]


> Eraser [12]


Я так разбираю каждый пакетик по байтикам и мне удобнее работать с SHex (16-тиричное представление)

Надо указатель - загоню эти данные в буффер и получу указатель.


Eraser   (2005-02-15 21:25:00) [19]

Anatoly Podgoretsky ©

А разве StrToInt умеет преобразовывать hex символы?


Adder   (2005-02-15 21:22:00) [20]

ps В Edit1 - копируешь свою SHex, в Memo1 - увидишь строку


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо