Это работает для захвата первых битовых флагов в начале байта. Это все равно оставило бы некоторую странную логику, скажем, для uint32, который запускает 4 бита в один байт и продолжается еще 3,5 байта.

ужно проанализировать и кодировать в устаревший двоичный формат сообщения в Java. Я начал с использования DataOutputStream для чтения / записи примитивных типов, но проблема, с которой я столкнулся, заключается в том, что формат сообщения не очень хорошо совпадает со смещением байтов и включает битовые флаги.

Например, я должен иметь дело с сообщениями, подобными этому:

+----------+---+---+----------+---------+--------------+
+uint32    +b   +b + uint32   +4bit enum+32 byte string+
+----------+---+---+----------+---------+--------------+

Где (b) - однобитовый флаг. Проблема в том, что примитивные типы java не выравниваются по границам байтов, поэтому я не смог бы использовать DataOutputStream для его кодирования, поскольку тип самого низкого уровня, который я могу записать, - это байт.

Существуют ли какие-либо библиотеки, стандартные или сторонние, для работы с произвольными форматами сообщений на битовом уровне?

Редактировать: Спасибо @Software Monkey за то, что вынудили меня более внимательно изучить мою спецификацию. Спецификация, которую я использую, фактически выравнивает границы байтов, поэтому DataOutputStream подходит. Учитывая мой первоначальный вопрос, я бы пошел с решением, предложенным @emboss.

Изменить: хотя было обнаружено, что формат сообщения для этого вопроса находится в границах байтов, я натолкнулся на другой формат сообщения, который применим к исходному вопросу. Этот формат определяет 6-битное сопоставление символов, где каждый символ в действительности занимает всего 6 бит, а не полный байт, поэтому строки символов не выравниваются по границам байтов. Я обнаружил несколько двоичных потоков вывода, которые решают эту проблему. Как этот:http://introcs.cs.princeton.edu/java/stdlib/BinaryOut.java.html

Ответы на вопрос(5)

Ваш ответ на вопрос