Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
c# Encoding
#1
Столкнулся с такой ошибкой.
Ругается вот на это.
Код:
protected string ReadString(int l)
        {
            byte[] stringBytes = ReadBytes(l);
            [color=red]string str = Encoding.GetEncoding(1251).GetString(stringBytes);[/color]

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

            return str;
        }

[Изображение: 0bBYUypwvh4.jpg]
Ответ
#2
Так понимаю строка пишется без длинны но с 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 байта
Ответ
#3
Еще проще:

[SRC="csharp"] 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;
}[/SRC]
Разработка Emu: PiercingBlow 90%, APB Reloaded 100%.
Самый действенный инструмент для самообучения - грабли.
Ответ
#4
Ошибка в этом пакете и тут есть длинна.
Код:
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());
    }
Ответ
#5
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
где ему присваивается значение?
Ответ
#6
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);
            [color=Cyan]Len_token = base.ReadShort();[/color]
            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());
        }
    }
Ответ
#7
byte[] stringData = ReadBytes(Len_token);
сначала получи все что по длине, потом уже форматируй массив в стринг
Ответ
#8
Necroz-Team Написал:byte[] stringData = ReadBytes(Len_token);
сначала получи все что по длине, потом уже форматируй массив в стринг

Спасибо получилось , но теперь когда хочу посмотреть токен , то нет текста.
Код:
Log.Info($"Lenght_Token : {Len_token} [color=Red]Token : {token}[/color]");
Ответ
#9
Boris2105 Написал:Спасибо получилось , но теперь когда хочу посмотреть токен , то нет текста.
Код:
Log.Info($"Lenght_Token : {Len_token} [color=Red]Token : {token}[/color]");
byte[] stringData = ReadBytes(Len_token);
token = new String(stringData);
Ответ
#10
Boris2105;427550 Написал:base.ReadShort();

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


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  C# RSA encoding for L2 Zubastic 6 2,664 09-24-2017, 09:11 PM
Последний пост: Zubastic

Перейти к форуму:


Пользователи, просматривающие эту тему: 4 Гость(ей)