c# Encoding - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming

Программирование / Programming
Ищете помощи в написании программы, есть сложность в выполнении задания (в институте и т.д.), пожалуйста, спросите у нас в данном форуме и мы обязательно вам поможем.

Ответ
Опции темы
Непрочитано 27.08.2017, 04:36   #1
Забанен за кидаловo/обман/развод

Автор темы (Топик Стартер) 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;
        }
Boris2105 вне форума Ответить с цитированием
Непрочитано 27.08.2017, 12:52   #2
Аватар для Necroz-Team
Пользователь

По умолчанию 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 байта
Necroz-Team вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 27.08.2017, 12:56   #3
Аватар для Awiion

По умолчанию 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#
__________________
Разработка Emu: PiercingBlow 90%, APB Reloaded 100%.
Самый действенный инструмент для самообучения - грабли.
Awiion вне форума Отправить сообщение для Awiion с помощью Skype™ Ответить с цитированием
Непрочитано 27.08.2017, 13:18   #4
Забанен за кидаловo/обман/развод

Автор темы (Топик Стартер) 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());
    }
Boris2105 вне форума Ответить с цитированием
Непрочитано 27.08.2017, 13:34   #5
Аватар для Necroz-Team
Пользователь

По умолчанию Re: c# Encoding

Цитата:
Сообщение от Boris2105 Посмотреть сообщение
Ошибка в этом пакете и тут есть длинна.
Код:
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
где ему присваивается значение?
Necroz-Team вне форума Ответить с цитированием
Непрочитано 27.08.2017, 13:47   #6
Забанен за кидаловo/обман/развод

Автор темы (Топик Стартер) Re: c# Encoding

Цитата:
Сообщение от Necroz-Team Посмотреть сообщение
Код:
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());
        }
    }
Boris2105 вне форума Ответить с цитированием
Непрочитано 27.08.2017, 13:57   #7
Аватар для Necroz-Team
Пользователь

По умолчанию Re: c# Encoding

byte[] stringData = ReadBytes(Len_token);
сначала получи все что по длине, потом уже форматируй массив в стринг
Necroz-Team вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 27.08.2017, 14:43   #8
Забанен за кидаловo/обман/развод

Автор темы (Топик Стартер) Re: c# Encoding

Цитата:
Сообщение от Necroz-Team Посмотреть сообщение
byte[] stringData = ReadBytes(Len_token);
сначала получи все что по длине, потом уже форматируй массив в стринг
Спасибо получилось , но теперь когда хочу посмотреть токен , то нет текста.
Код:
Log.Info($"Lenght_Token : {Len_token} Token : {token}");
Boris2105 вне форума Ответить с цитированием
Непрочитано 27.08.2017, 16:49   #9
Аватар для Necroz-Team
Пользователь

По умолчанию Re: c# Encoding

Цитата:
Сообщение от Boris2105 Посмотреть сообщение
Спасибо получилось , но теперь когда хочу посмотреть токен , то нет текста.
Код:
Log.Info($"Lenght_Token : {Len_token} Token : {token}");
byte[] stringData = ReadBytes(Len_token);
token = new String(stringData);
Necroz-Team вне форума Ответить с цитированием
Непрочитано 27.08.2017, 21:20   #10
Аватар для PROGRAMMATOR
Администратор

По умолчанию Re: c# Encoding

Цитата:
Сообщение от Boris2105 Посмотреть сообщение
base.ReadShort();
А чего base. ? У PROTOCOL_LOGIN_REQ тоже имеются такие методы?
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR вне форума Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 18:29. Часовой пояс GMT +3.

Вверх