Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
PROTOCOL_LOGIN_ACK
#51
Boris2105,
Ты использовал велосипед, перешел на BinaryReader,
Это была у тебя одно и тоже, только ты весь мусор откинул в сторону и что тебе не нужно,
Теперь ты к BinaryReader снова стал прикручивать какие то оффесты, зачем!?
Открой google, msdn, или даже Visual Studio>2012, там есть примеры как этим пользоваться,
Тебе нужно указать в стриме буфер, стрим указать к брайну, все.
-----------------------------------------
дальше просто добавляешь
byte, ushort, int, ulong, bytes;
-----------------------------------------
Ответ
#52
Boris2105;412783 Написал:а так чтобы указывать размер в каждом файле по разному не было.
Можно перевод, пожалуйста. kappa

[SRC="csharp"]protected byte[] ReadBytes(int count) => reader.ReadBytes(count);
[/SRC]


Это что ли?
Ответ
#53
Awiion Написал:Boris2105,
Ты использовал велосипед, перешел на BinaryReader,
Это была у тебя одно и тоже, только ты весь мусор откинул в сторону и что тебе не нужно,
Теперь ты к BinaryReader снова стал прикручивать какие то оффесты, зачем!?
Открой google, msdn, или даже Visual Studio>2012, там есть примеры как этим пользоваться,
Тебе нужно указать в стриме буфер, стрим указать к брайну, все.
-----------------------------------------
дальше просто добавляешь
byte, ushort, int, ulong, bytes;
-----------------------------------------


Решил сделать как вы сказали и правда оказалось все намного проще , благодарю за помощь.

[SRC="csharp"]
MemoryStream stream;
BinaryReader reader;

/// <summary>
///
/// </summary>
/// <param name="buffer"></param>
public void Init(byte[] buffer)
{
stream = new MemoryStream(buffer);
reader = new BinaryReader(stream);
ReadImpl();
RunImpl();
}

/// <summary>
///
/// </summary>
/// <returns></returns>
///
protected byte ReadByte() => reader.ReadByte();
protected short ReadShort() => reader.ReadInt16();
protected int ReadInt() => reader.ReadInt32();
protected long ReadLong() => reader.ReadInt64();
protected byte[] ReadBytes(int count) => reader.ReadBytes(count);
protected sbyte ReadSByte() => reader.ReadSByte();
protected ushort ReadUShort() => reader.ReadUInt16();
protected uint ReadUInt() => reader.ReadUInt32();
protected ulong ReadULong() => reader.ReadUInt64();
protected string ReadString() => reader.ReadString();
protected void Skip(int size) => reader.ReadBytes(size);

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

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

return str;
}
public virtual void ReadImpl()
{
}

public virtual void RunImpl()
{
}
[/SRC]

Возникла другая проблема.
Почему то логин и пароль идут не совсем корректно и не в том порядке.
Login: Kirito
Password: 135635
[SRC="csharp"]
class PROTOCOL_LOGIN_REQ : ClientPacket
{
private string Login, Password;
private int LoginLength, PasswordLength;
public override void ReadImpl()
{
byte[] Unk = ReadBytes(100);
PasswordLength = ReadByte();
Password = ReadString(PasswordLength);
LoginLength = ReadByte();
Login = ReadString(LoginLength);
Log.Info("Login {0} Password{1}", Login, Password);

}

public override void RunImpl()
{

var manager = AccountManager.Instance;
Client.Account = manager.GetAccount(Login);
Client.SendPacket(new PROTOCOL_LOGIN_ACK(manager.IsValidAccount(Login, Password), Client.Account));
}
[/SRC]
[Изображение: 7X9niKH6yIM.jpg]
Ответ
#54
Boris2105, Теперь в начале напиши ReadInt, или пропусти 4 байта.
2 байта = Длина пакета
2 байта = Опкод.

или используй Seek
_________________________________
Password = ReadString(PasswordLength);
LoginLength = ReadByte();

Тоже изврат, пиши так,

Код:
Password= ReadString(ReadByte()).Trim();
Ответ
#55
Boris2105, нужно знать, что ты передаёшь в:

[SRC="csharp"]public void Init(byte[] buffer)
[/SRC]


И если нужно прочитать текст, у которого размер указан в byte, типа:

Код:
byte // text length
string // text

Можешь использовать просто ReadString:

[SRC="csharp"]password = ReadString();
login = ReadString();
[/SRC]
Ответ
#56
PROGRAMMATOR Написал:Boris2105, нужно знать, что ты передаёшь в:

[SRC="csharp"]public void Init(byte[] buffer)
[/SRC]


И если нужно прочитать текст, у которого размер указан в byte, типа:

Код:
byte // text length
string // text

Можешь использовать просто ReadString:

[SRC="csharp"]password = ReadString();
login = ReadString();
[/SRC]

[SRC=Csharp]
public void Init(byte[] buffer)
{
stream = new MemoryStream(buffer);
reader = new BinaryReader(stream);
ReadImpl();
RunImpl();
}
[/SRC]
Ответ
#57
Я тебя спросил о том, что у тебя в buffer?
Ответ
#58
PROGRAMMATOR Написал:Я тебя спросил о том, что у тебя в buffer?

byte[] buffer = new byte[2048];
Ответ
#59
Прикольные шутеечки. (нет)
Можешь воспользоваться советом Awiion, просто пропустив 4 байта (opcode + seed).

[SRC="csharp"]stream = new MemoryStream(buffer, 4, buffer.Length - 4);
[/SRC]
Ответ
#60
PROGRAMMATOR Написал:Прикольные шутеечки. (нет)

я туплю и не понимаю что надо :Olen':
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Структура PROTOCOL_LOGIN_ACK Sojang 15 4,025 01-20-2016, 01:02 AM
Последний пост: PROGRAMMATOR

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


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