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.
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.GIF8
. Um arquivo SGI movi começa comMOVI
. Um estilo de arquivo zip começa comZZ
o formato pkzip mais popularPK
. 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.Respostas:
0xDC 0xDC
fonte
0x00
ou qualquer outra coisa, mas a op não queria isso.No UTF-8, os bytes C0, C1 e F5 - FF são ilegais. O primeiro byte deve ser ASCII ou um byte no intervalo C2-F4; qualquer outro byte inicial não é válido UTF-8.
No UTF-16, o arquivo normalmente começa com a marca de ordem de bytes (U + FEFF), caso contrário, os aplicativos precisam adivinhar a ordem de bytes. Os pontos de código no intervalo D800-DBFF são bytes iniciais para um par substituto, e DC00-DFFF são os bytes finais para um par substituto.
Assim, eu usaria a combinação de bytes
F5DC
. Esses dois valores são:Se precisar de mais opções,
F5DD
através deF5DF
todos têm os mesmos 3 propriedades, como fazemF6DC
-F6DF
,F7DC
-F7DF
eF8DC
-F8DF
, para um total de 16 combos byte diferentes para escolher.fonte
0xDC
seria válido o UTF-8?0xDC
é um byte de chumbo UTF-8 para uma sequência de 2 bytes. Ele deve ser seguido por um10xxxxxx
byte de continuação para que seja válido.0xDC
não é um byte de continuação válido, portanto,0xDC 0xDC
não é um UTF-8 válido.80
-BF
.Se você estiver tentando usar um caractere não imprimível para indicar "não texto", será difícil superar 0x89:
Geralmente, quando você forma números mágicos, "não texto" é um ponto menor. Vou ter que procurar a referência, mas um dos formatos gráficos padrão (TIFF, eu acho) tem algo como seis diferentes informações úteis do seu número mágico.
fonte