Sto progettando un formato di file e voglio farlo nel modo giusto. Poiché si tratta di un formato binario, il primo byte (o byte) del file non dovrebbe formare caratteri testuali validi (proprio come nell'intestazione del file PNG 1 ). Ciò consente agli strumenti che non riconoscono il formato di vedere ancora che non è un file di testo guardando i primi byte.
Qualsiasi punto di codice sopra riportato 0x7F
non è valido US-ASCII, quindi è facile. Ma per Unicode è una storia completamente diversa. Oltre ai caratteri Unicode validi ci sono personaggi , caratteri non sentiti e sentinelle per uso privato , come ho trovato nelle Domande frequenti su personaggi , personaggi non sentiti e sentinelle per uso privato Unicode .
Quale sarebbe una sequenza sentinella di byte che posso usare all'inizio del file che comporterebbe US-ASCII, UTF-8, UTF-16LE e UTF-16BE non validi?
- Ovviamente il primo byte non può avere un valore inferiore in
0x80
quanto sarebbe un carattere US-ASCII (controllo) valido, quindi0x00
non può essere utilizzato. - Inoltre, poiché i caratteri per uso privato sono caratteri Unicode validi, non posso nemmeno usare quei punti di codice.
- Dal momento che deve funzionare con UTF-16 sia little-endian che big-endian, un non carattere come quello
0xFFFE
non è possibile in quanto il suo contrario0xFEFF
è un carattere Unicode valido. - Le FAQ sopra menzionate suggeriscono di non utilizzare nessuno dei non caratteri in quanto ciò comporterebbe comunque una sequenza Unicode valida, quindi qualcosa del genere
0xFFFF
è anche fuori dall'immagine.
Quali sarebbero i valori sentinella a prova di futuro che mi restano da usare?
1 ) Il formato PNG ha come primo byte il 0x89
valore non ASCII , seguito dalla stringa PNG
. Uno strumento che legge i primi byte di un PNG può determinare che si tratta di un file binario poiché non può essere interpretato 0x89
. Un file GIF, d'altra parte, inizia direttamente con la stringa ASCII valida e leggibile GIF
seguita da altri tre caratteri ASCII validi. Per GIF uno strumento potrebbe determinare che si tratta di un file di testo leggibile. Questo è sbagliato e l'idea di avviare il file con una sequenza di byte non testuali è nata da Designing File Formats di Andy McFadden.
GIF8
. Un file movi SGI inizia con MOVI
. Uno stile di file di archivio zip inizia con ZZ
, inizia il formato pkzip più popolare PK
. Il vincolo che il primo byte sia un carattere di testo non valido non sembra corrispondere a ciò che si trova in natura. Sono curioso di sapere perché questo è un requisito.
Since it is a binary format, the first bytes of the file should not form valid textual characters
- Dovresti guardare il file magico (/ usr / share / magic o / etc / magic su molti sistemi unix) che mostra come questa applicazione identifica i tipi di file. Un file PNG inizia con\x89PNG\x0d\0a\x1a\x0a
- nota il "PNG" lì dentro, che è una stringa non elaborata . Le sequenze\x89
e simili sono byte non stampabili.