2011-12-17 9 views
10

Necesito poder delimitar una secuencia de datos binarios. Estaba pensando en usar algo como el carácter ASCII EOT (fin de transmisión) para hacer esto.Delimitar secuencias binarias

Sin embargo, estoy un poco preocupado: ¿cómo puedo estar seguro de que la secuencia binaria particular utilizada para esto (0b00000100) no aparecerá en mis propias secuencias binarias, dando así un falso positivo en la delimitación?

En otras palabras, ¿cómo se maneja mejor el delimitador binario?

EDITAR: ... Sin usar un encabezado de longitud. Lo siento muchachos, debería haber mencionado esto antes.

Respuesta

7

Normalmente, envuelve sus datos binarios en un formato conocido, por ejemplo, con un encabezado fijo que describe los datos posteriores. Si está tratando de encontrar delímetros en una secuencia de datos desconocida, generalmente necesita una secuencia de escape. Por ejemplo, algo así como HDLC, donde 0x7E es el delímetro de cuadros. Los datos deben estar codificados de manera que si hay 0x7E dentro de los datos, se reemplaza con 0x7D seguido de un XOR de los datos originales. 0x7D en la secuencia de datos se escapa de manera similar.

3

Si los registros binarios realmente pueden contener datos, intente agregar una longitud antes de los datos en lugar de un marcador después de los datos. Esto a veces se denomina longitud de prefijo porque la longitud es anterior a los datos.

De lo contrario, tendría que escapar del delimitador en la secuencia de bytes (y escapar de la secuencia de escape).

3

Puede anteponer el tamaño de los datos binarios que tiene ante sí. Si está tratando con datos transmitidos y no conoce su tamaño de antemano, puede dividirlo en fragmentos y hacer que cada fragmento comience con el campo de tamaño.

Si establece un tamaño máximo para un fragmento, terminará con todo, excepto el último fragmento de la misma longitud, lo que simplificará el acceso aleatorio en caso de que lo requiera.

10

Tienes cinco opciones:

  • utilizar un carácter delimitador que es poco probable que ocurra. Esto corre el riesgo de que adivine incorrectamente. No recomiendo este enfoque.
  • Utilice un carácter delimitador y escape sequence para incluir el delimitador. Es posible que necesite duplicar el carácter de escape, según lo que facilite el análisis. (Piense en el C \0 para incluir un ASCII NUL en algún contenido.)
  • Use un delimitador frase que puede determinar que no ocurra. (Piense en el mime message boundaries.)
  • Anteponga un campo de longitud de algún tipo, de modo que sepa leer los siguientes N bytes como datos. Esto tiene la desventaja de requerirle saber esta longitud antes de escribir los datos, lo que a veces es difícil o imposible.
  • Utilice algo mucho más complicado, como ASN.1, para describir por completo todo su contenido para usted. (No sé si realmente recomendaría esto a menos que pueda hacer buen uso de - ASN.1 es incómodo de usar en las mejores circunstancias, pero permite la interpretación de datos binarios completamente inequívoca.)
Cuestiones relacionadas