Saya mendesain format file dan saya ingin melakukannya dengan benar. Karena ini adalah format biner, byte pertama (atau byte) dari file tidak boleh membentuk karakter tekstual yang valid (seperti pada header file PNG 1 ). Ini memungkinkan alat yang tidak mengenali format untuk tetap melihat bahwa itu bukan file teks dengan melihat beberapa byte pertama.
Setiap codepoint di atas 0x7F
tidak valid US-ASCII, jadi itu mudah. Tetapi bagi Unicode, ini adalah cerita yang sangat berbeda. Terlepas dari karakter Unicode yang valid ada karakter penggunaan pribadi , noncharacters dan sentinels , seperti yang saya temukan di FAQ Unicode Private-Use Characters, Noncharacters & Sentinels .
Apa yang akan menjadi urutan sentinel byte yang dapat saya gunakan pada awal file yang akan menghasilkan US-ASCII, UTF-8, UTF-16LE dan UTF-16BE yang tidak valid?
- Jelas byte pertama tidak dapat memiliki nilai di bawah
0x80
karena itu akan menjadi karakter US-ASCII (kontrol) yang valid, jadi0x00
tidak dapat digunakan. - Juga, karena karakter penggunaan pribadi adalah karakter Unicode yang valid, saya juga tidak dapat menggunakan codepoint tersebut.
- Karena itu harus bekerja dengan baik UTF-16 little-endian dan big-endian, noncharacter seperti
0xFFFE
juga tidak mungkin karena kebalikannya0xFEFF
adalah karakter Unicode yang valid. - FAQ yang disebutkan di atas menyarankan untuk tidak menggunakan karakter nonchar karena masih akan menghasilkan urutan Unicode yang valid, jadi sesuatu seperti
0xFFFF
ini juga keluar dari gambar.
Apa nilai sentinel bukti masa depan yang tersisa untuk saya gunakan?
1 ) Format PNG memiliki byte pertama sebagai nilai non-ASCII 0x89
, diikuti oleh string PNG
. Alat yang membaca beberapa byte pertama dari PNG dapat menentukan itu adalah file biner karena tidak dapat diartikan 0x89
. Sebaliknya, file GIF dimulai langsung dengan string ASCII yang valid dan mudah dibaca GIF
diikuti oleh tiga karakter ASCII yang lebih valid. Untuk GIF suatu alat mungkin menentukan itu adalah file teks yang dapat dibaca. Ini salah dan ide memulai file dengan urutan byte non-tekstur berasal dari Merancang Format File oleh Andy McFadden.
GIF8
. File film SGI dimulai dengan MOVI
. Satu gaya file arsip zip dimulai dengan ZZ
, format pkzip yang lebih populer dimulai dengan PK
. Batasan bahwa byte pertama menjadi karakter teks yang tidak valid tampaknya tidak cocok dengan apa yang ditemukan di alam liar. Saya ingin tahu mengapa ini merupakan persyaratan.
Since it is a binary format, the first bytes of the file should not form valid textual characters
- Anda harus melihat file ajaib (/ usr / share / magic, atau / etc / magic di banyak sistem unix) yang menunjukkan bagaimana aplikasi ini mengidentifikasi jenis file. Sebuah file PNG dimulai dengan\x89PNG\x0d\0a\x1a\x0a
- perhatikan "PNG" di sana, itu adalah string mentah. Urutan\x89
dan sejenisnya adalah byte yang tidak dapat dicetak.