Bir dosya formatı tasarlıyorum ve doğru yapmak istiyorum. Bir ikili biçim olduğundan, dosyanın ilk bayt (veya bayt) gerekir değil (sadece PNG dosya başlığında gibi geçerli metinsel karakterleri oluşturmak 1 ). Bu, biçimi tanımayan araçların ilk birkaç bayta bakarak bir metin dosyası olmadığını görmelerini sağlar.
Yukarıdaki herhangi bir kod noktası 0x7F
geçersiz US-ASCII olduğundan, bu kolaydır. Ama Unicode için bu tamamen farklı bir hikaye. Dışında geçerli Unicode karakter vardır , özel kullanım karakterler , noncharacters ve nöbetçi Ben bulunduğu gibi, Unicode Özel Kullanım Karakterler, Noncharacters & Nöbetçiler SSS .
Dosyanın başlangıcında geçersiz US-ASCII, UTF-8, UTF-16LE ve UTF-16BE ile sonuçlanabilecek bir bayt dizisi ne olurdu?
- Açıkça görülüyor ki, ilk bayt aşağıda
0x80
geçerli bir US-ASCII (kontrol) karakteri olabileceği için bir değere sahip0x00
olamaz , bu yüzden kullanılamaz. - Ayrıca, özel kullanım karakterleri geçerli Unicode karakterler olduğundan, bu kod noktalarını da kullanamıyorum.
- O çalışmak zorunda olduğundan, her iki küçük endian ve büyük endian UTF-16, bir noncharacter gibi
0xFFFE
onun tersi olarak da mümkün değildir0xFEFF
, geçerli bir Unicode karakter. - Yukarıda belirtilen SSS herhangi birini kullanarak değil önerir noncharacters şey gibi pek hala geçerli bir Unicode sırayla neden olacağını olarak
0xFFFF
dışarı resmin aynı zamanda.
Kullanmam için bırakılacak geleceğe hazır sentinel değerleri ne olur?
1 ) PNG formatı ilk baytı ASCII olmayan 0x89
değeri, ardından dizeyi içerir PNG
. Bir PNG'nin ilk birkaç baytını okuyan bir araç, yorumlayamadığı için ikili bir dosya olduğunu belirleyebilir 0x89
. Öte yandan, bir GIF dosyası doğrudan geçerli ve okunabilir ASCII dizesi ve GIF
ardından üç geçerli ASCII karakteriyle başlar. GIF için bir araç, okunabilir bir metin dosyası olduğunu belirleyebilir. Bu yanlıştır ve dosyayı dokusal olmayan bir bayt dizisiyle başlatma fikri Andy McFadden tarafından Dosya Formatları Tasarlama'dan geldi .
GIF8
. Bir SGI movi dosyası ile başlar MOVI
. Bir stil zip arşiv dosyası ile başlar ZZ
, daha popüler pkzip formatı ile başlar PK
. İlk baytın geçersiz bir metin karakteri olması kısıtlaması, vahşi ortamda bulunanlarla eşleşmiyor gibi görünüyor. Bunun neden bir gereklilik olduğunu merak ediyorum.
Since it is a binary format, the first bytes of the file should not form valid textual characters
- Bu uygulamanın dosya türlerini nasıl tanımladığını gösteren sihirli dosyaya (/ usr / share / magic veya / etc / magic) bakmalısınız. Bir PNG dosyası ile başlar\x89PNG\x0d\0a\x1a\x0a
- içindeki "PNG" yi not edin, bu ham bir dize. Diziler\x89
ve benzerleri yazdırılamayan baytlardır.