Просмотр полной версии : гуид персонажа?
Интересует как узнать guid своего персонажа которым я захожу в мир.
Порылся в снифе и нашел вроде бы два варианта: первый - в сообщениии SMSG_CHAR_ENUM и второй - в SMSG_NAME_QUERY_RESPONSE. В последнем приходит packed guid и имя.
В связи с этим два вопроса:
guid каждого персонажа задается при его создании на сервере и больше не меняется ?
Как перевести текст который возвращает сервер в нормальный вид? некоторые символы заменены на 2 байта, логику пока не разглядел
RomanRom2
16.07.2010, 11:40
CMSG_PLAYER_LOGIN
гуид никогда не меняется.
текс в обычном юникоде.
я ж тебе в аську всё написал.
да не юникод это, какая-то двухбайтовая ахинея -)
RomanRom2
16.07.2010, 11:50
давным давно, когда динозавры еще были молодые, я на скору руку сделал две функции и (вот парадокс) пользуюсь ими до сих пор.
procedure cmd_CMSG_MESSAGECHAT(sender: TWorldUser);
var
imsg: T_CMSG_MESSAGECHAT;
i: longint;
begin
i:= msgParse(sender.RBuf, imsg);
...
MainLog('CMSG_MESSAGECHAT type='+strr(imsg.cType)+', lang='+strr(imsg.cLanguage)+' ['+wow_unicode866(imsg.cText)+']',1,0,0);
...
function wow_unicode866(s: string): string;
var
ofs: integer;
c: byte;
begin
ofs:=1;
result:='';
while ofs<=length(s) do
begin
c:=ord(s[ofs]);
if c in [208,209] then
begin
inc(ofs);
c:=ord(s[ofs]);
if (c in [128..143]) then result:=result+chr(c+96);
if (c in [144..191]) then result:=result+chr(c-16);
end
else
result:=result+s[ofs];
inc(ofs);
end;
end;
function wow_unicode1251(s: string): string;
var
ofs: integer;
c: byte;
begin
ofs:=1;
result:='';
while ofs<=length(s) do
begin
c:=ord(s[ofs]);
if c in [208,209] then
begin
inc(ofs);
c:=ord(s[ofs]);
if (c in [128..143]) then result:=result+chr(c+112);
if (c in [144..191]) then result:=result+chr(c+48);
end
else
result:=result+s[ofs];
inc(ofs);
end;
end;
может пригодится.
Там не юникод, а UTF-8. А гуид персонажа меняется при трансфере на другой сервер.
На C# с UTF8 вообще элементарно работать:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Wlp.IO
{
public static class CStringExtensions
{
/// <summary> Reads the NULL terminated string from
/// the current stream and advances the current position of the stream by string length + 1.
/// <seealso cref="BinaryReader.ReadString"/>
/// </summary>
public static string ReadCString(this BinaryReader reader)
{
return reader.ReadCString(Encoding.UTF8);
}
/// <summary> Reads the NULL terminated string from
/// the current stream and advances the current position of the stream by string length + 1.
/// <seealso cref="BinaryReader.ReadString"/>
/// </summary>
public static string ReadCString(this BinaryReader reader, Encoding encoding)
{
try
{
var bytes = new List<byte>();
byte b;
while ((b = reader.ReadByte()) != 0)
bytes.Add(b);
return encoding.GetString(bytes.ToArray());
}
catch (EndOfStreamException exc)
{
Logger.Instance.WarnFormat("ReadCString failed: {0}!", exc.Message);
return String.Empty;
}
}
public static void WriteCString(this BinaryWriter writer, string str)
{
var bytes = Encoding.UTF8.GetBytes(str);
writer.Write(bytes);
writer.Write((byte)0);
}
}
}
RomanRom2
16.07.2010, 13:20
а UTF-8 разве не юникод (http://ru.wikipedia.org/wiki/BOM#UTF-8)? :pardon:
в дельфи наверняка тоже есть встроенные средства. в 2010ой точно есть, она вся такая юникодная стала.
я просто написал сам по быстрой и не маялся с поиском. в данном случае было проще замазать, чем отскрести =)))
Рома, я ж говорил что это UTF-8, а ты уникод -)
TOM_RUS, RomanRom2 спасибо за подсказки
P.S.
в общем выкрутился парой WideCharToMultiByte(...)
При перекодировании данных из Windows-1251 в UTF-8 и Unicode получаем разные данные, так что кодировки разные, надо использовать UTF-8.
Minimajack
16.07.2010, 18:25
При перекодировании данных из Windows-1251 в UTF-8 и Unicode получаем разные данные, так что кодировки разные, надо использовать UTF-8.
ну е-маё
unicode это не кодировка, это обобщенное название расширенных кодировок символов, таких как utf-8, utf-16, utf-32...
естественно представление разное...
Vladimir
16.07.2010, 19:34
Ну обычно когда говорят юникод имеют ввиду utf-16, а про utf-8 явно говорят, все остальные просто очень редко используются...
vBulletin® v3.8.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot