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.
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.GIF8
. Un fichier SGI movi commence parMOVI
. Un style de fichier d'archive zip commence parZZ
, le format pkzip plus populaire commence parPK
. 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.Réponses:
0xDC 0xDC
la source
0x00
ou autre chose, mais op ne voulait pas cela.En UTF-8, les octets C0, C1 et F5 - FF sont illégaux. Le premier octet doit être ASCII ou un octet dans la plage C2-F4, tout autre octet de départ n'est pas UTF-8 valide.
En UTF-16, le fichier commence normalement par la marque d'ordre des octets (U + FEFF), sinon les applications doivent deviner l'ordre des octets. Les points de code de la plage D800-DBFF sont des octets de tête pour une paire de substitution, et DC00-DFFF sont les octets de fin pour une paire de substitution.
Ainsi, j'utiliserais le combo d'octets
F5DC
. Ces deux valeurs sont:Si vous avez besoin de plus d' options,
F5DD
par le biais deF5DF
tous les mêmes propriétés 3, tout commeF6DC
-F6DF
,F7DC
-F7DF
etF8DC
-F8DF
, pour un total de 16 combinaisons d'octets différents à choisir.la source
0xDC
serait-il valide UTF-8?0xDC
est un octet de tête UTF-8 pour une séquence de 2 octets. Il doit être suivi d'un10xxxxxx
octet de continuation pour qu'il soit valide.0xDC
n'est pas un octet de continuation valide, donc0xDC 0xDC
n'est pas valide UTF-8.80
-BF
.Si vous essayez d'utiliser un caractère non imprimable pour indiquer «pas de texte», vous aurez du mal à battre 0x89:
Généralement, lorsque vous formez des nombres magiques, le «non-texte» est un point mineur. Je vais devoir chercher la référence, mais l'un des formats graphiques standard (TIFF, je pense) a quelque chose comme six informations différentes de son numéro magique.
la source