PDA

Просмотр полной версии : String в Widestring как?


Zero
05.03.2012, 21:22
Получаю я пакет от сервера:
http://rghost.ru/36862956/image.png (http://rghost.ru/36862956.view)

С помощью след. кода:

var s1:string;
begin
s1:=tcp.Receiveln();
m1.Lines.Add(s1);
end;


Вывод в мемо:
http://rghost.ru/36862999/image.png (http://rghost.ru/36862999.view)

Т.е. Получается строка Юникода находится в Анси s1:string;.
Как можно нормально вывести типа как делает l2phx в преобразовании.

Morfik
05.03.2012, 21:23
function PWideToString(pw: PWideChar): string;
var
p: PChar;
iLen: integer;
begin
iLen := lstrlenw(pw) + 1;
GetMem(p, iLen);
WideCharToMultiByte(CP_ACP, 0, pw, iLen, p, iLen * 2, nil, nil);
Result := p;
FreeMem(p, iLen);
end;

Zero
05.03.2012, 21:24
Спасибо, с тем разобрался, но вот вопрос еще
var pck:widestring;
size:word;
begin
tcp.ReceiveBuf(size, 2);
SetLength(pck, size-2);
tcp.ReceiveBuf(pck[1], size-2);
m1.Lines.Add(pck);
end;
Получаю вывод с какойто лишней инфой, которой в пакете вообще нет
"Best Minecraft§1§352\drivers\etc\services"
Красного в пакете вообще нет, откуда оно берется и как с ним бороться подскажите пожалуйста

Sherman
05.03.2012, 23:01
tcp.ReceiveBuf(pck[1], size-2);
m1.Lines.Add(pck);
Как у тебя при этом AV не случается вообще?

Ты бы пакет в строку конвертировал сначала по принципу каждый байт пакета через IntToHex в 16 формат....
А то у тебя кракозябры должны в Мемо сыпаться..
Пакет же не строка... а массив байт, и чтобы он стал читаемым его конвертировать надо в строку по нужному тебе представлению.
var S:string;
for i:=0 to size-1 do S:=S+IntToHex(pck[i],2);
Хотябы так...

Zero
05.03.2012, 23:14
Да нет нормально выводится.
Вот только предполагаемый размер всегда равен 255 и поэтому выводится лишнее с памяти системы.
Использую простой TcpClient

Sherman
06.03.2012, 00:50
Ну хз, если символы псевдографики и прочая лабуда это нормально ))))

mira
06.03.2012, 00:58
дак если известна длина строки копируй ее в буфер какойнеть чтоб был 0-терминальный символ. у тя в пакете либо предполагаетса что длина строки постоянна (что врятли), либо гдето указаен ее размер.

у тя в пакете у строки нет завершающего нулевого символа поэтому в строку читаетса все содержимое опосля нее, всякий мусор из памяти)))
как уже прально подметили простое чтение строки при определенных раскладах может повлеч и AV

Zero
06.03.2012, 04:48
Тему можно клоус, переписал на java..