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.
GIF8
. Un archivo SGI movi comienza con MOVI
. Un estilo de archivo zip comienza con ZZ
el formato pkzip más popular PK
. 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.
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.