Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

Unicode в Строку   Найти похожие ветки 

 
Mouserx   (2005-02-15 18:06) [0]

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


 
Юрий Зотов ©   (2005-02-15 18:22) [1]

> каждый байт - буква в формате иникод

Разве в юникоде не двухбайтовые символы?


 
Mouserx   (2005-02-15 18:46) [2]


> Юрий Зотов

Я ошибся. 2 байта.
Имееться ввиду например есть у меня SHex : String в которой содержиться последовательность байтиков в 16-ричном ввиде.
Эта последовательность байтиков - Null Terminated Unicode message

Меня волнует как получить текст из этой последовательности и как сделать обратное действие.


 
Anatoly Podgoretsky ©   (2005-02-15 19:25) [3]

Тогда повторно ошибся, для представления одного символа требуется лва байта, для юникода соотвественно 4.


 
Vit@ly ©   (2005-02-15 19:29) [4]

:)?


 
Alexander Panov ©   (2005-02-15 19:29) [5]

см. MultiByteToWideChar


 
Anatoly Podgoretsky ©   (2005-02-15 19:31) [6]

Alexander Panov ©   (15.02.05 19:29) [5]
Думаешь? Он эе молчит о точном формате данные, пока не приведет образец данных можно только гадать, а это дело неблагодарное :-(


 
Mouserx   (2005-02-15 19:55) [7]


> Anatoly Podgoretsky


Почему 4?

а можно пример пожалуйста для моего случая?


 
Anatoly Podgoretsky ©   (2005-02-15 19:57) [8]

Потому что Юникод16 это 2 байта, а в двух хекс символах можно отразить только один байт. Вспоиминая математику получаем 2*2 итого 4 символа, оно же в просторечье 4 байта. напримет код 00 00 (два байта) в хекс будет "0000"


 
Eraser ©   (2005-02-15 21:05) [9]

Mouserx

Откуда у тебя эта последовательность байтиков в 16-ричном ввиде?
Может не стоит так заморачиваться...


 
Mouserx   (2005-02-15 21:09) [10]


> Anatoly Podgoretsky

Ето я знаю,
но в [3] вы мне говорите про 4 байта а это уже будет в хекс 8 символов.

И собственно по сабжу.
Вот например в SHex у меня есть следующее:
"04 3F 04 40 04 38 04 3C 04 35 04 40 00 00"

как мне получить из этого нужную строку и наоборот?

Покажите пожалуйста код. Спасибо.


 
Mouserx   (2005-02-15 21:14) [11]


> Eraser ©   (15.02.05 21:05) [9]
> Mouserx
>
> Откуда у тебя эта последовательность байтиков в 16-ричном
> ввиде?


С игрушки.


> Может не стоит так заморачиваться...

Стоит. Очень надо.


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

Mouserx

И там именно строка с хекс кодами?
Или всётаки как-нибудь можно достать указатель на эти данные?


 
Adder ©   (2005-02-15 21:19) [13]

Примерно так...

unit UnicodeUnit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,WinSock, ExtCtrls;
type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Memo1: TMemo;
   Panel1: TPanel;
   Panel2: TPanel;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
   i:integer;
   Size:integer;
   s:String;
   Buffer:PByte;
   B:PWord;
   W:PWideChar;
begin
   S:=StringReplace(Edit1.Text," ","",[rfReplaceAll]);//+"0000";
   if S<>"" then
   begin
       GetMem(Buffer,Length(S) div 2);
       Size:=HexToBin(PChar(@S[1]), PChar(Buffer), Length(S) div 2);
       b:=PWord(Buffer);
       i:=0;
       while i < Size do begin b^:=htons(b^);Inc(b,1);inc(i,2);end;
       W:=PWideChar(Buffer);
       Memo1.Lines.Add(WideCharLenToString(W,Size));
   end;
end;

end.


 
Anatoly Podgoretsky ©   (2005-02-15 21:21) [14]

Mouserx   (15.02.05 21:09) [10]
Вот например в SHex у меня есть следующее:
"04 3F 04 40 04 38 04 3C 04 35 04 40 00 00"

Узнаю русский язык.
Надо отдельно преобразвывать четную и нечетную пару к виду $O43F, эту последовательность через StrToInt присваивать WideChar или к WideString[i], пока не встретишь код $0000 это признак конца строки. Вот такой алгоритм. Код напишешь сам, он тривиальный.


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

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


 
Eraser ©   (2005-02-15 21:25) [16]

Anatoly Podgoretsky ©

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


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


> Eraser [12]


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

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


 
Eraser ©   (2005-02-15 21:29) [18]

Mouserx

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


 
Anatoly Podgoretsky ©   (2005-02-15 21:29) [19]

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


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

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


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

Anatoly Podgoretsky ©

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

var s: string;
   i: integer;

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

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


 
Anatoly Podgoretsky ©   (2005-02-15 21:36) [22]

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


 
Eraser ©   (2005-02-15 21:43) [23]

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

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

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


 
Anatoly Podgoretsky ©   (2005-02-15 21:44) [24]

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


 
Anatoly Podgoretsky ©   (2005-02-15 21:48) [25]

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


 
Eraser ©   (2005-02-15 21:49) [26]

Anatoly Podgoretsky ©

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


 
Anatoly Podgoretsky ©   (2005-02-15 21:53) [27]

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


 
Eraser ©   (2005-02-15 21:58) [28]

Anatoly Podgoretsky ©

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


 
Anatoly Podgoretsky ©   (2005-02-15 22:01) [29]

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


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

Есть одна неувязочка по поводу конверации 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" мне необходимо будет самому добавлять?


 
palva ©   (2005-02-16 14:12) [31]

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.


 
palva ©   (2005-02-16 14:25) [32]

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:27) [33]

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


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

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


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;


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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.04 c
1-1108598303
wsMaximized
2005-02-17 02:58
2005.03.06
wsMaximized


14-1108435828
Думкин
2005-02-15 05:50
2005.03.06
С Днем рождения! 15 февраля


4-1102326344
Алим
2004-12-06 12:45
2005.03.06
Автоблокировка компьютера


1-1108808059
Kiriill
2005-02-19 13:14
2005.03.06
EXE


14-1106960312
Инк
2005-01-29 03:58
2005.03.06
Реален ли ИИ ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский