Necesito analizar y codificar a un formato de mensaje binario heredado en Java. Empecé utilizando DataOutputStream para leer/escribir tipos primitivos, pero el problema que tengo es que el formato del mensaje no se alinea muy bien con las compensaciones de bytes e incluye indicadores de bits.Cómo analizar/codificar formatos de mensajes binarios?
Por ejemplo, tengo que lidiar con mensajes como este:
+----------+---+---+----------+---------+--------------+
+uint32 +b +b + uint32 +4bit enum+32 byte string+
+----------+---+---+----------+---------+--------------+
Dónde (b) es una bandera de un bit. El problema es que los tipos de primitiva Java no se alinean con los límites de bytes, por lo que no podría usar DataOutputStream para codificar esto, ya que el tipo de nivel más bajo que puedo escribir es un byte.
¿Hay bibliotecas, estándar o de terceros, para manejar formatos de mensajes de nivel de bit arbitrario?
Edit: Gracias a @Software Monkey por obligarme a mirar mis especificaciones más de cerca. La especificación que estoy usando se alinea realmente en los límites de bytes para que DataOutputStream sea apropiado. Sin embargo, dada mi pregunta original, me habría ido con la solución propuesta por @emboss.
Editar: Aunque el formato del mensaje para esta pregunta se descubrió que estaba en los límites de bytes me encontré con otro formato de mensaje que es aplicable a la pregunta original. Este formato define una asignación de caracteres de 6 bits donde cada carácter realmente solo ocupa 6 bits, no el byte completo, por lo que las cadenas de caracteres no se alinean en los límites de bytes. He descubierto varios flujos de salida binarios que abordan este problema. Como este: http://introcs.cs.princeton.edu/java/stdlib/BinaryOut.java.html
Esta es una muy inusual especulación; con mis años de experiencia en comunicaciones por cable, me gustaría cuestionar si tienes ese diseño correcto. En particular, su segundo uint32 y la cadena de 32 bytes comienzan a medio camino a través de un byte, ¡seguro que no! No es inusual para empaquetar banderas en bits en un byte, palabra o dword para un protocolo de cable, pero para haber desalineado bytes completos, palabras y dwords es evidentemente idiota. –
Ack, tienes razón. Tenía una imagen pobre del formato del mensaje para salir y ahora veo 'bits de reserva' enredados entre los indicadores de bits y la siguiente primitiva alineándolos en un límite de bytes. ¡Gracias! – kenen
Debe actualizar su pregunta con la especificación real (y una nota para que la respuesta del relieve no parezca fuera de lugar). –