Язык определения протокола - PullRequest
7 голосов
/ 22 января 2010

Какое определение протокола вы рекомендуете? Я оценил буферы протокола Google, но он не позволяет мне контролировать размещение полей в создаваемом пакете. Я предполагаю, что то же самое относится и к Thrift. Мои требования:

  1. указать расположение полей в пакете
  2. разрешить для битовых полей
  3. условные: флаг (битовое поле) = true означает, что данные могут появиться в более позднем месте в пакете
  4. способность определять структуру пакета, ссылаясь на определение другого пакета

Спасибо.

(" Flavor " на SourceForge, используемый для определения MPEG-4, может быть кандидатом, но я ищу что-то, что, кажется, имеет больше сообщества и предпочтительно работает в среде .NET. )

Ответы [ 3 ]

5 голосов
/ 31 октября 2011

Посмотрите на ASN.1 http://es.wikipedia.org/wiki/ASN.1

ОПРЕДЕЛЕНИЯ FooProtocol :: = НАЧАЛО

FooQuestion ::= SEQUENCE {
    trackingNumber INTEGER,
    question       IA5String
}

FooAnswer ::= SEQUENCE {
    questionNumber INTEGER,
    answer         BOOLEAN
}

END

Похоже, для удовлетворения ваших основных требований:

- Bit detail
- ordered content
- type references
- not sure, about conditions

Широко используется, и вы можете найти некоторые реализации на Java и Python

3 голосов
/ 23 января 2010

Мне было бы интересно узнать причины ваших требований. Зачем вам нужно контролировать положение полей? Почему битовые поля важны? Conditionals?

Похоже, у вас есть (более или менее) фиксированный проводной формат, для которого вам нужно написать анализатор, и в этом случае ни один из существующих популярных форматов протокола / сериализации (Protobufs, Thrift, JSON, Yaml и т. Д. .) будет работать для вас.

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

0 голосов
/ 22 января 2010

Как насчет C # ?

например

class MySimplePDLData {
  // format: name (or blank if padding), bit length, value (or blank if data),
  // name of presence flag field (or blank if no presence flag), C# type
  // one packet type per string, fields separated by pipes (|)
  string[] pdl = {

// MY-SIMPLE-PDL-START

  ",8,0xf8,|version,8,,Int32|type,8,,Int32|id1,64,,Int64",
  ...

// MY-SIMPLE-PDL-END

  };
}

Если данные уже находятся в памяти, вам не нужно выполнять ввод-вывод в формате файла. Отсюда вы можете либо динамически интерпретировать пакеты, либо сгенерировать необходимый исходный код C # для распознавания / упаковки / распаковки пакетов, снова используя сам C #.

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