Je conçois un format de fichier et je veux le faire correctement. Puisqu'il s'agit d'un format binaire, le tout premier octet (ou octets) du fichier ne doit pas former de caractères textuels valides (comme dans l'en-tête de fichier PNG 1 ). Cela permet aux outils qui ne reconnaissent pas le format de voir que ce n'est pas un fichier texte en regardant les premiers octets.
Tout point de code ci 0x7F
- dessus n'est pas valide US-ASCII, donc c'est facile. Mais pour Unicode, c'est une toute autre histoire. En dehors de caractères Unicode valides il y a des caractères à usage privé , non - caractères et factionnaires , comme je l' ai trouvé dans les caractères Unicode Private-utilisation, et Sentinelles FAQ non - caractères .
Quelle serait une séquence sentinelle d'octets que je pourrais utiliser au début du fichier qui résulterait en US-ASCII, UTF-8, UTF-16LE et UTF-16BE invalides?
- De toute évidence, le premier octet ne peut pas avoir une valeur inférieure
0x80
car ce serait un caractère US-ASCII (contrôle) valide, il0x00
ne peut donc pas être utilisé. - De plus, comme les caractères à usage privé sont des caractères Unicode valides, je ne peux pas non plus utiliser ces points de code.
- Puisqu'il doit fonctionner à la fois avec le petit endian et le big-endian UTF-16, un non- caractère tel que celui-ci
0xFFFE
n'est également pas possible car son inverse0xFEFF
est un caractère Unicode valide. - La FAQ mentionnée ci-dessus suggère de n'utiliser aucun des non- caractères car cela entraînerait toujours une séquence Unicode valide, donc quelque chose comme
0xFFFF
est également hors de l'image.
Quelles seraient les valeurs sentinelles à l'épreuve du temps qui me resteraient à utiliser?
1 ) Le format PNG a comme tout premier octet la 0x89
valeur non ASCII , suivie de la chaîne PNG
. Un outil qui lit les premiers octets d'un PNG peut déterminer qu'il s'agit d'un fichier binaire car il ne peut pas l'interpréter 0x89
. Un fichier GIF, en revanche, commence directement par la chaîne ASCII valide et lisible GIF
suivie de trois autres caractères ASCII valides. Pour GIF, un outil peut déterminer qu'il s'agit d'un fichier texte lisible. C'est faux et l'idée de démarrer le fichier avec une séquence d'octets non texturée est venue de Designing File Formats par Andy McFadden.
GIF8
. Un fichier SGI movi commence par MOVI
. Un style de fichier d'archive zip commence par ZZ
, le format pkzip plus populaire commence par PK
. La contrainte que le premier octet soit un caractère de texte non valide ne semble pas correspondre à ce qui se trouve dans la nature. Je suis curieux de savoir pourquoi c'est une exigence.
Since it is a binary format, the first bytes of the file should not form valid textual characters
- Vous devriez regarder le fichier magique (/ usr / share / magic, ou / etc / magic sur de nombreux systèmes Unix) qui montre comment cette application identifie les types de fichiers. Un fichier PNG commence par\x89PNG\x0d\0a\x1a\x0a
- notez le "PNG" là-dedans, c'est une chaîne brute. Les séquences\x89
et similaires sont des octets non imprimables.