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 0x7F
es 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,
0x80
ya que sería un carácter US-ASCII (control) válido, por0x00
lo 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
0xFFFE
tampoco es posible ya que su reverso0xFEFF
es 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
0xFFFF
tambié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 0x89
valor 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 GIF
seguida 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\x89
y similares son bytes no imprimibles.GIF8
. Un archivo SGI movi comienza conMOVI
. Un estilo de archivo zip comienza conZZ
el 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 0xDC
fuente
0x00
o 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,
F5DD
a través deF5DF
todos tienen las mismas propiedades 3, al igual queF6DC
-F6DF
,F7DC
-F7DF
yF8DC
-F8DF
, para un total de 16 combinaciones de bytes diferentes para elegir.fuente
0xDC
¿sería válido UTF-8?0xDC
es un byte principal UTF-8 para una secuencia de 2 bytes. Debe ser seguido por un10xxxxxx
byte de continuación para que sea válido.0xDC
no es un byte de continuación válido, por0xDC 0xDC
lo 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