Список <byte>ведет себя иначе, чем ArrayBufferWriter <byte>? - PullRequest
1 голос
/ 21 февраля 2020

Решено перестроить 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()));

Первое выдает правильное значение, а второе - пустую строку.

1 Ответ

1 голос
/ 21 февраля 2020

_packet.GetSpan() возвращает диапазон записи для записи, который не будет содержать уже записанных данных. Вы, вероятно, хотите _packet.WrittenSpan вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...