Решено перестроить List<byte>
в ArrayBufferWriter<byte>
, но при "компиляции" компоновщика получаются разные выходные данные. Кажется, список работает, но ArrayBufferWriter не пишет правильно? Я пробовал GetMemory()
и GetStream()
Я вызываю WriteShort
в конструкторе, а затем вызываю WriteString
дважды, передавая ""
оба раза. Это происходит, когда в классе есть только ArrayBufferWriter<byte>
.
Я просто добавляю их туда, чтобы показать без кода больше, чем требуется.
Код:
public class ServerPacketBuilder
{
private readonly ArrayBufferWriter<byte> _packet;
private readonly List<byte> _packetList;
protected ServerPacketBuilder(short packetId)
{
_packet = new ArrayBufferWriter<byte>();
_packetList = new List<byte>();
WriteShort(packetId);
}
protected void WriteString(string data)
{
WriteShort((short) data.Length);
WriteBytes(Encoding.Default.GetBytes(data));
}
private void WriteBytes(byte[] data)
{
_packet.Write(data);
_packetList.AddRange(data);
}
private void WriteShort(short length)
{
_packet.Write(BitConverter.GetBytes(length));
_packetList.AddRange(BitConverter.GetBytes(length));
}
public byte[] GetBytes()
{
var finalBytes = new List<byte>();
Console.WriteLine("1: " + Encoding.Default.GetString(_packetList.ToArray()));
Console.WriteLine("2: " + Encoding.Default.GetString(_packet.GetSpan().ToArray()));
finalBytes.AddRange(BitConverter.GetBytes(_packetList.Count()));
finalBytes.Reverse();
finalBytes.AddRange(_packetList);
return finalBytes.ToArray();
}
}
Они выводят разные значения
Console.WriteLine("1: " + Encoding.Default.GetString(_packetList.ToArray()));
Console.WriteLine("2: " + Encoding.Default.GetString(_packet.GetSpan().ToArray()));
Первое выдает правильное значение, а второе - пустую строку.