Форум: "Основная";
Текущий архив: 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