![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Unicode в Строку
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 - увидишь строку