Estou projetando um formato de arquivo e quero fazê-lo corretamente. Por ser um formato binário, o primeiro byte (ou bytes) do arquivo não deve formar caracteres textuais válidos (como no cabeçalho do arquivo PNG 1 ). Isso permite que as ferramentas que não reconhecem o formato ainda vejam que não é um arquivo de texto observando os primeiros bytes.
Qualquer ponto de código acima 0x7F
é US-ASCII inválido, portanto é fácil. Mas para Unicode é uma história totalmente diferente. Além dos caracteres Unicode válidos, existem caracteres de uso privado , não caracteres e sentinelas , como encontrei nas Perguntas frequentes sobre caracteres de uso privado Unicode, não caracteres e sentinelas .
O que seria uma sequência sentinela de bytes que eu possa usar no início do arquivo que resultaria em US-ASCII, UTF-8, UTF-16LE e UTF-16BE inválidos?
- Obviamente, o primeiro byte não pode ter um valor abaixo,
0x80
pois seria um caractere US-ASCII (controle) válido, portanto,0x00
não pode ser usado. - Além disso, como os caracteres de uso privado são caracteres Unicode válidos, também não posso usar esses pontos de código.
- Como ele deve funcionar com UTF-16 little-endian e big-endian, um não caractere como
0xFFFE
também não é possível, pois seu inverso0xFEFF
é um caractere Unicode válido. - As perguntas frequentes acima mencionadas sugerem não usar nenhum dos não - caracteres, pois isso ainda resultaria em uma sequência Unicode válida; portanto, algo como
0xFFFF
também está fora de cena.
Quais seriam os valores sentinela à prova de futuro que ainda restam para eu usar?
1 ) O formato PNG tem como primeiro byte o 0x89
valor não ASCII , seguido pela string PNG
. Uma ferramenta que lê os primeiros bytes de um PNG pode determinar que é um arquivo binário, pois não pode ser interpretado 0x89
. Um arquivo GIF, por outro lado, começa diretamente com a sequência ASCII válida e legível, GIF
seguida por mais três caracteres ASCII válidos. Para o GIF, uma ferramenta pode determinar que é um arquivo de texto legível. Isso está errado e a idéia de iniciar o arquivo com uma sequência de bytes não textuais veio de Designing File Formats, de Andy McFadden.
GIF8
. Um arquivo SGI movi começa com MOVI
. Um estilo de arquivo zip começa com ZZ
o formato pkzip mais popular PK
. A restrição de que o primeiro byte seja um caractere de texto inválido não parece corresponder ao encontrado na natureza. Estou curioso para saber por que isso é um requisito.
Since it is a binary format, the first bytes of the file should not form valid textual characters
- Você deve observar o arquivo mágico (/ usr / share / magic ou / etc / magic em muitos sistemas unix) que mostra como esse aplicativo identifica os tipos de arquivo. Um arquivo PNG começa com\x89PNG\x0d\0a\x1a\x0a
- observe o "PNG", é uma string não processada. As sequências\x89
e similares são bytes não imprimíveis.