Estoy diseñando un formato de archivo y quiero hacerlo bien. Como es un formato binario, el primer byte (o bytes) del archivo no debe formar caracteres de texto válidos (como en el encabezado 1 del archivo PNG ). Esto permite que las herramientas que no reconocen el formato sigan viendo que no se trata de un archivo de texto al observar los primeros bytes.
Cualquier punto de código anterior 0x7Fes US-ASCII no válido, por lo que es fácil. Pero para Unicode es una historia completamente diferente. Aparte de caracteres Unicode válidos existen caracteres de uso privado , noncharacters y centinelas , ya que encontramos en los Unicode privado utiliza caracteres, Noncharacters y centinelas FAQ .
¿Cuál sería una secuencia de bytes centinela que puedo usar al comienzo del archivo que resultaría en US-ASCII, UTF-8, UTF-16LE y UTF-16BE no válidos?
- Obviamente, el primer byte no puede tener un valor inferior,
0x80ya que sería un carácter US-ASCII (control) válido, por0x00lo que no se puede usar. - Además, dado que los caracteres de uso privado son caracteres Unicode válidos, tampoco puedo usar esos puntos de código.
- Dado que debe funcionar con UTF-16 little-endian y big-endian, un no carácter como
0xFFFEtampoco es posible ya que su reverso0xFEFFes un carácter Unicode válido. - Las preguntas frecuentes mencionadas anteriormente sugieren no usar ninguno de los no caracteres, ya que eso aún generaría una secuencia Unicode válida, por lo que algo como eso
0xFFFFtambién está fuera de la imagen.
¿Cuáles serían los valores centinela a prueba de futuro que me quedan para usar?
1 ) El formato PNG tiene como primer byte el 0x89valor no ASCII , seguido de la cadena PNG. Una herramienta que lee los primeros bytes de un PNG puede determinar que es un archivo binario ya que no puede interpretarlo 0x89. Un archivo GIF, por otro lado, comienza directamente con la cadena ASCII válida y legible GIFseguida de tres caracteres ASCII más válidos. Para GIF, una herramienta puede determinar que es un archivo de texto legible. Esto está mal y la idea de iniciar el archivo con una secuencia de bytes no textural surgió de Designing File Formats de Andy McFadden.

Since it is a binary format, the first bytes of the file should not form valid textual characters- Debería mirar el archivo mágico (/ usr / share / magic o / etc / magic en muchos sistemas unix) que muestra cómo esta aplicación identifica los tipos de archivos. Un archivo PNG comienza con\x89PNG\x0d\0a\x1a\x0a- tenga en cuenta el "PNG" allí, que es una cadena sin formato. Las secuencias\x89y similares son bytes no imprimibles.GIF8. Un archivo SGI movi comienza conMOVI. Un estilo de archivo zip comienza conZZel formato pkzip más popularPK. La restricción de que el primer byte sea un carácter de texto no válido no parece coincidir con lo que se encuentra en la naturaleza. Tengo curiosidad por qué esto es un requisito.Respuestas:
0xDC 0xDCfuente
0x00o lo que sea, pero op no quería eso.En UTF-8, los bytes C0, C1 y F5 - FF son ilegales. El primer byte debe ser ASCII o un byte en el rango C2-F4, cualquier otro byte inicial no es válido UTF-8.
En UTF-16, el archivo normalmente comienza con la marca de orden de bytes (U + FEFF), de lo contrario las aplicaciones tienen que adivinar el orden de bytes. Los puntos de código en el rango D800-DBFF son bytes iniciales para un par sustituto, y DC00-DFFF son los bytes finales para un par sustituto.
Por lo tanto, usaría el byte combo
F5DC. Estos dos valores son:Si necesita más opciones,
F5DDa través deF5DFtodos tienen las mismas propiedades 3, al igual queF6DC-F6DF,F7DC-F7DFyF8DC-F8DF, para un total de 16 combinaciones de bytes diferentes para elegir.fuente
0xDC¿sería válido UTF-8?0xDCes un byte principal UTF-8 para una secuencia de 2 bytes. Debe ser seguido por un10xxxxxxbyte de continuación para que sea válido.0xDCno es un byte de continuación válido, por0xDC 0xDClo que no es válido UTF-8.80-BF.Si está intentando utilizar un carácter no imprimible para indicar "no texto", le resultará difícil superar 0x89:
En general, cuando forma números mágicos, "sin texto" es un punto menor. Tendré que buscar la referencia, pero uno de los formatos gráficos estándar (TIFF, creo) tiene algo así como seis piezas diferentes de información útil de su número mágico.
fuente