C # Чтение байтового массива - PullRequest
3 голосов
/ 21 февраля 2011

Хорошо, я создаю клиентское приложение сервера <->.

В основном сервер получает пакет, содержащий заголовок [2 байта], cryptokeys [2 байта] и данные

Я думал осоздание класса для загрузки в него целого пакета (byte []) и последующей обработки пакета внутренними методами класса.Теперь к вопросу.Какой будет лучший подход к этому?Мне нужно иметь возможность читать Int16 Int32 String (int длина) и, вероятно, плавать

Редактировать: Вроде как двоичный читатель, но для байта [] в качестве ввода

Ответы [ 4 ]

3 голосов
/ 21 февраля 2011

Я бы сказал, BinaryReader - ваш лучший выбор.Из прошлого опыта бывают случаи, когда вам нужно наследовать от BinaryReader.Основной пример - когда вам нужно прочитать строку с нулевым символом в конце, потому что BinaryReader читает строки с префиксом длины.Или вы можете написать свой собственный класс, но в итоге вы обеспечите ту же функциональность, что и BinaryReader.

В конце я бы, вероятно, просто создал свой собственный класс.Таким образом, если вам нужно внести изменения в то, как вы хотите извлечь данные, вы можете просто отредактировать свой класс.Если вы напишите весь проект с помощью BinaryReader и поймете, что вам нужно добавить функциональность, вы будете ввернуты .

public class MyBinaryReader : BinaryReader
{
    public MyBinaryReader(byte[] input) : base(new MemoryStream(input))
    {
    }

    public override string ReadString()
    {
         // read null-terminated string
    }
}
2 голосов
/ 21 февраля 2011

Существует класс BitConverter. Его статические члены принимают байтовый массив и начальный индекс и преобразуют байты в указанный тип. Этого достаточно?

0 голосов
/ 21 февраля 2011

Почему бы не использовать Stream, например NetworkStream?

0 голосов
/ 21 февраля 2011

Если это так просто, то достаточно BinaryReader в потоке или BitConverter непосредственно в буфере;и Encoding для строк.Но сначала согласитесь с порядком байтов;)

Если он более сложный и основан на объектах, то я предлагаю использовать предварительно консервированный сериализатор.Написание полного сериализатора не тривиально.

Возможно, вы захотите взглянуть на API потоковой передачи, а не загружать все это в память - это может дорого обойтись для больших сообщений.

...