Мне нужно разработать синтаксический анализатор для формата обмена двоичными сообщениями, то есть анализатора сообщений, который анализирует двоичное сообщение в представлении Java-объекта. Я хотел бы спросить, какие полезные шаблоны можно использовать для реализации парсера самым гибким способом. Может ли кто-нибудь описать это в двух словах или предоставить ресурсы для чтения?Написание парсера для формата двоичных сообщений
ответ
Поскольку вы пытаетесь читать двоичные данные и преобразовывать их в Java-объект, существует много подходов, но, во-первых, вы должны знать структуру/протокол своего двоичного файла.
Образец, который я покажу вам, это стиль, которым я (если бы был вами) был использован для этого сценария.
Убедитесь, что у вас есть входной поток, который будет передавать ваши двоичные данные. Если у вас есть массив байтов, создайте ByteArrayInputStream.
В графе объектов каждый узел/объект должен реализовывать что-то вроде метода parseIn (InputStream s).
public class Parent extends ArrayList<Child> {
int age;
// ... more code here
public void parseIn(InputStream is) throws IOException {
// .. logic to read the stream into this instance.
DataInputStream dis = new DataInputStream(is);
this.age = dis.readInt();
// .. if necessary
Child c = new Child();
c.parseIn(InputStream is);
this.add(c);
}
// ... more code here
}
public class Child {
int height;
short weight;
Date birthdate;
public void parseIn(InputStream is) throws IOException {
// .. logic to read the stream into this instance.
DataInputStream dis = new DataInputStream(is);
height = dis.readInt();
weight = dis.readShort();
birthdate = new Date(dis.readLong());
}
}
Итак, когда вы получите ваш поток, вы просто
InputStream stream = this.getInputStream();
Parent p = new Parent();
parent.parseIn(stream);
И так далее, и так далее.
Несколько раз вам необходимо прочитать базовый поток, чтобы вы могли прочитать его вперед. Например, при чтении строковых данных в двоичном потоке. Либо вы продолжаете читать байт за байтом, пока не найдете байт терминатора (как символ окончания 0 стиля стиля C). Или указать длину строки в первом байте, а затем прочитать массив байтов этой длины.
Надеюсь, вы получите Идею. И я надеюсь, что это поможет.
Осторожно: используйте DataInputStream только в том случае, если входной поток был создан с помощью java DataOutputStream. –
Я не поклонник отсутствия конечных полей в этом решении. – brain
Java использует BigEndian, когда число чтения/записи больше 8 бит. И DataOutputStream использует для этой цели bigendian для CMIIW. IETF сделал межсетевое взаимодействие BigEndian (RFC 1700) ... Я понимаю, что может быть случай для LittleEndian, но я думаю, у ByteBuffer есть некоторое решение вокруг LittleEndian. Во всяком случае, вышеприведенные фрагменты только для того, чтобы выразить шаблон. Не будем подробно рассказывать о том, как вы читаете байт по байту в терминах little/big endian. Таким образом, использование DataInputStream может быть использовано или заменено наиболее подходящим случаем. –
- 1. Дизайн парсера протокола двоичных сообщений для последовательных данных
- 2. Написание парсера для регулярных выражений
- 3. Написание парсера для строки JSON
- 4. Написание парсера для смешанных языков
- 5. Написание парсера для javascript-кода
- 6. Написание парсера для S-выражений
- 7. Написание парсера BibTex
- 8. Написание ручного парсера
- 9. php: написание фигурного парсера
- 10. Написание парсера с Wisent
- 11. Написание общего метода для парсера Enum
- 12. Написание парсера запросов в JavaScript
- 13. Сравнение двоичных сообщений
- 14. Написание официального парсера языка с Lisp
- 15. Написание алгоритма поиска сообщений
- 16. Структурирование для сериализации/десериализации двоичных сообщений
- 17. Написание парсера (для языка разметки): Теория и практика
- 18. Написание простого простого парсера для Unity3d (C# или Actionscript)
- 19. Написание тестов для функций парсера файлов модульным способом
- 20. Написание парсера сценария командной строки для 3DS Max 2010
- 21. Написание сообщений Django для регистрации файлов также
- 22. Регистрация двоичных сообщений один раз
- 23. Совет формата сообщений
- 24. Написание структурированных двоичных файлов в haskell
- 25. Чтение и написание двоичных файлов в C++
- 26. написание вручную WCF сообщений POX
- 27. Написание fortran упорядоченных двоичных файлов из python
- 28. Написание двоичных данных для ответа в ASP.NET 5
- 29. Различия формата Java и C# двоичных символов
- 30. Дезертизация/разбор пользовательского формата сообщений
https://github.com/jparsec/jparsec –
Возможно, вы можете попробовать прочитать о том, как [буферы протокола Google] (https://developers.google.com/protocol-buffers/docs/encoding) разработаны (или просто используйте их!) –
Зависит от того, что вы подразумеваете под «парсером». Обычно [парсер] (https://en.wikipedia.org/wiki/Parsing) читает текст, а не двоичные данные. – Andreas