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,
0x80pois seria um caractere US-ASCII (controle) válido, portanto,0x00nã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
0xFFFEtambé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
0xFFFFtambé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 0x89valor 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, GIFseguida 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 ZZo 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\x89e similares são bytes não imprimíveis.