networking - segun - meme y memetica
Delimitando secuencias binarias (4)
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.
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.
Sin embargo, estoy un poco preocupado: ¿cómo puedo saber con certeza 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.
Puede anteponer el tamaño de los datos binarios antes. 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.
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).
Tienes cinco opciones:
- Use un carácter delimitador que es poco probable que ocurra. Esto corre el riesgo de que adivine incorrectamente. No recomiendo este enfoque.
- Use un carácter delimitador y una secuencia de escape 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 una frase delimitadora que pueda determinar que no ocurra. (Piense en los límites del mensaje de mimo ).
- Anteponga un campo de longitud de algún tipo, para que sepa leer los siguientes N bytes como datos. Esto tiene el inconveniente de que debes saber esta longitud antes de escribir los datos, lo que a veces es difícil o imposible.
- Usa algo mucho más complicado, como ASN.1 , para describir por completo todo tu contenido. (No sé si realmente recomendaría esto a menos que pueda hacer un buen uso de él; la ASN.1 es incómoda de usar en las mejores circunstancias, pero permite una interpretación de datos binarios completamente inequívoca).