Байтный массив и бинарное чтение - отладочная среда для тестирования / разработки? - PullRequest
0 голосов
/ 13 июня 2011

Я (почти) совершенно новичок в этой теме и много читаю на эту тему.Книги, Stackexchange, блоги и тд.Вы знаете, общее для разработчика.Я чувствую, что «понимания общей картины» легче достичь, когда вы можете отладить и проверить себя в том, о чем читаете.Я нахожу много теоретической информации, но меньше практического способа попробовать «отключен».

Мои идеи до сих пор примерно такие: byte[], BitConverter.GetBytes / BitConverter.ToInt32, Encoding.UTF8.GetString() тесно связаны с некоторыми видами позиций, где начинается массив.Как если бы первые 4 байта в дейтаграмме содержали msg, тогда startindex будет равен 4 для sessionid?Все это похоже на тяжелые вещи для этой цели.

Есть ли лучший способ упаковать / распаковать такие массивы?Сообщения / дейтаграммы имеют максимальный размер 64 КБ и никогда не распространяются на различные сообщения.

Более конкретно: я хочу смоделировать (например, консольное приложение) входящий пакет и распаковать информацию, полезную для моей системы,Затем, напротив, передайте ответ обратно в байтовый массив.Как будет выглядеть хороший примерный класс для этой цели?Как кодировать / декодировать в него?Спецификации протокола имеют фиксированные байты для пакета.Я оставлю пример ниже (не из реальной спецификации, хотя);

// One Packet 
// 
// Description   -> |Identifier|name length|message length|    name   |    message   |
// Size in bytes -> |     4    |     4     |       4      |name length|message length|

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

В большинстве случаев вы не читаете / пишете двоичную информацию самостоятельно. Существует несколько структур, которые могут сериализовать классы / структуры в / из двоичных данных. BinaryFormatter или protobuf являются двумя способами.

Но если вы хотите попробовать это самостоятельно, я предлагаю вам использовать FileStream, поскольку он работает точно так же, как любой другой поток (немного упрощенное утверждение, но почти верно;) Используйте BinaryWriter для записи информации и BinaryReader читать.

Нет никаких причин обрабатывать массив byte[] напрямую. Вы всегда можете инициализировать MemoryStream, чтобы получить доступ к BinaryReader и BinaryWriter

.

Важно то, что вы читаете / пишете поля точно в том же порядке.

Обновление

Пример использования обновленного вопроса:

// Description   -> |Identifier|name length|message length|    name   |    message   |
// Size in bytes -> |     4    |     4     |       4      |name length|message length|

using (var stream  = new MemoryStream(yourByteBuffer))
{
   using (reader = new BinaryReader(stream))
   {
       var identifier = reader.ReadInt32();
       var nameLength = reader.ReadInt32();
       var msgLength = reader.ReadInt32();
       var name = reader.ReadChars(nameLength);
       var msg = reader.ReadChars(msgLength);
   }
}

// to get a string from the chars:
var message = new string(msg);
0 голосов
/ 13 июня 2011

System.IO содержит типы, используемые для работы с файлами и потоками байтов. Многие из них включают примеры, например. открытие файла для чтения в виде байтового потока: Конструктор FileStream (String, FileMode) .

...