Разбирать двоичные данные для сервера загрузки С#?
-
19-09-2019 - |
Вопрос
Мне нужно, чтобы одно из моих приложений C# .NET работало в качестве сервера загрузки.Протокол довольно прост, но я не знаю простого способа создания/анализа двоичных данных.
Есть идеи:
(источник: tcpipguide.com)
Решение
Есть несколько способов сделать это.Возможно, вам удастся поиграть с атрибуты маршалинга например, StructLayout, чтобы упаковать структуру в массив байтов, но это, вероятно, сложно и не стоит затраченных усилий.
Вы можете использовать специализированную структуру, такую как Протобуф атрибутировать класс таким образом, чтобы он был сериализован в соответствии с нужной вам структурой.
Но, по моему опыту, самый простой, быстрый и гибкий метод создания такой двоичной структуры — использовать класс MemoryStream для хранения буфера данных, а затем использовать Двоичный писатель вокруг него, чтобы фактически записать двоичные данные в поток.
В любом случае полезно иметь работающий сервер, на который можно ссылаться.Используйте такой инструмент, как Wireshark или Microsoft Network Monitor, для захвата проводного трафика, чтобы вы могли сравнить свой проводной формат с примером, который, как известно, работает.
Другие советы
Вы можете создать простую структуру, например:
[Serializable]
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct MyData {
public byte OpCode;
public byte HardwareType;
public byte HardwareAddressType;
public byte Hops;
public int TransactionId;
public short Seconds;
public short Flags;
public int ClientIPAddress;
public int CurrentIP;
// all other fields in the required sequence
}
и используйте код из этот пост в блоге для сериализации/десериализации пакетов.Но может возникнуть проблема с ServerName и BootFilename из-за различий в кодировке и, возможно, вам нужно указать точное FieldOffset для каждого из полей (см. эта тема на msdn подробности).
Надеюсь, это поможет :)