Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Программирование / Programming (https://forum.zone-game.info/forumdisplay.php?f=98)
-   -   c# Encoding (https://forum.zone-game.info/showthread.php?t=42471)

Boris2105 27.08.2017 04:36

c# Encoding
 
Столкнулся с такой ошибкой.
Ругается вот на это.
Код:

        protected string ReadString(int l)
        {
            byte[] stringBytes = ReadBytes(l);
            string str = Encoding.GetEncoding(1251).GetString(stringBytes);

            int length = str.IndexOf(char.MinValue);
            if (length != -1)
                str = str.Substring(0, length);

            return str;
        }

https://pp.userapi.com/c638226/v6382...bBYUypwvh4.jpg

Necroz-Team 27.08.2017 12:52

Re: c# Encoding
 
Так понимаю строка пишется без длинны но с null терминатором?
Код:

        /// <summary>
        /// Get null terminated string
        /// </summary>
        /// <param name="maxLen"></param>
        /// <returns></returns>
        public string GetNTString(ushort maxLen = ushort.MaxValue)
        {
            return GetNTString(Encoding.Unicode, maxLen);
        }

        /// <summary>
        /// Get null-terminared string
        /// </summary>
        /// <param name="encoding"></param>
        /// <param name="maxLen"></param>
        /// <returns></returns>
        public string GetNTString(Encoding encoding, ushort maxLen = ushort.MaxValue)
        {
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < maxLen; i++)
            {
                short sym = encoding.IsSingleByte ? GetInt8() : GetInt16();
                if (sym == 0)
                    break;

                sb.Append((char)sym);
            }

            return sb.ToString();
        }

Где у меня GetInt8() читай 1 байт, где GetInt16() читай 2 байта

Awiion 27.08.2017 12:56

Re: c# Encoding
 
Еще проще:

 public string ReadString(int Length)
        {
            string Text;
            Text = Encoding.GetEncoding(1251).GetString(Reader.ReadBytes(Length), 0, Length);
 
            int Index = Text.IndexOf('\0');
            if (Index != -1)
            {
                Text = Text.Remove(Index);
            }
            return Text;
        }
Code: C#

Boris2105 27.08.2017 13:18

Re: c# Encoding
 
Ошибка в этом пакете и тут есть длинна.
Код:

public class PROTOCOL_LOGIN_REQ : ClientPacket
    {
        public static readonly Logger Log = Logger.Instance;
        public string token;
        public int Len_token;
        public override void ReadImpl()
       
        {
            base.ReadImpl();
            byte[] Unk = base.ReadBytes(99);
            token = base.ReadString(Len_token);
            byte[] Unk1 = base.ReadBytes(3);
            Log.Info($"Lenght_Token : {Len_token} Token : {token}");
        }
        base.Client.SendPacket(new PROTOCOL_LOGIN_ACK());
    }


Necroz-Team 27.08.2017 13:34

Re: c# Encoding
 
Цитата:

Сообщение от Boris2105 (Сообщение 427548)
Ошибка в этом пакете и тут есть длинна.
Код:

public class PROTOCOL_LOGIN_REQ : ClientPacket
    {
        public static readonly Logger Log = Logger.Instance;
        public string token;
        public int Len_token;
        public override void ReadImpl()
       
        {
            base.ReadImpl();
            byte[] Unk = base.ReadBytes(99);
            token = base.ReadString(Len_token);
            byte[] Unk1 = base.ReadBytes(3);
            Log.Info($"Lenght_Token : {Len_token} Token : {token}");
        }
        base.Client.SendPacket(new PROTOCOL_LOGIN_ACK());
    }


Код:

Len_token
где ему присваивается значение?

Boris2105 27.08.2017 13:47

Re: c# Encoding
 
Цитата:

Сообщение от Necroz-Team (Сообщение 427549)
Код:

Len_token
где ему присваивается значение?

Вот тут , просто не заметил и не вставил.
Он есть но ошибка все равно появляется.
Код:

public class PROTOCOL_LOGIN_REQ : ClientPacket
    {
        public static readonly Logger Log = Logger.Instance;
        public string token;
        public int Len_token;
        public override void ReadImpl()
        {
            base.ReadImpl();
            byte[] Unk = base.ReadBytes(99);
            Len_token = base.ReadShort();
            token = base.ReadString(Len_token);
            byte[] Unk1 = base.ReadBytes(3);
            Log.Info($"Lenght_Token : {Len_token} Token : {token}");
        }
        public override void RunImpl()
        {
            base.Client.SendPacket(new PROTOCOL_LOGIN_ACK());
        }
    }


Necroz-Team 27.08.2017 13:57

Re: c# Encoding
 
byte[] stringData = ReadBytes(Len_token);
сначала получи все что по длине, потом уже форматируй массив в стринг

Boris2105 27.08.2017 14:43

Re: c# Encoding
 
Цитата:

Сообщение от Necroz-Team (Сообщение 427551)
byte[] stringData = ReadBytes(Len_token);
сначала получи все что по длине, потом уже форматируй массив в стринг

Спасибо получилось , но теперь когда хочу посмотреть токен , то нет текста.
Код:

Log.Info($"Lenght_Token : {Len_token} Token : {token}");

Necroz-Team 27.08.2017 16:49

Re: c# Encoding
 
Цитата:

Сообщение от Boris2105 (Сообщение 427552)
Спасибо получилось , но теперь когда хочу посмотреть токен , то нет текста.
Код:

Log.Info($"Lenght_Token : {Len_token} Token : {token}");

byte[] stringData = ReadBytes(Len_token);
token = new String(stringData);

PROGRAMMATOR 27.08.2017 21:20

Re: c# Encoding
 
Цитата:

Сообщение от Boris2105 (Сообщение 427550)
base.ReadShort();

А чего base. ? У PROTOCOL_LOGIN_REQ тоже имеются такие методы?


Текущее время: 06:15. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot