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.
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.GIF8
. File film SGI dimulai denganMOVI
. Satu gaya file arsip zip dimulai denganZZ
, format pkzip yang lebih populer dimulai denganPK
. 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.Jawaban:
0xDC 0xDC
sumber
0x00
atau apa pun, tetapi op tidak menginginkan itu.Dalam UTF-8, byte C0, C1, dan F5 - FF adalah ilegal. Byte pertama harus berupa ASCII atau byte dalam rentang C2-F4, byte awal lainnya tidak valid UTF-8.
Dalam UTF-16, file biasanya dimulai dengan Byte Order Mark (U + FEFF), jika tidak aplikasi harus menebak urutan byte. Codepoints dalam kisaran D800-DBFF adalah byte memimpin untuk pasangan pengganti, dan DC00-DFFF adalah byte tambahan untuk pasangan pengganti.
Jadi, saya akan menggunakan kombo byte
F5DC
. Kedua nilai tersebut adalah:Jika Anda membutuhkan lebih banyak pilihan,
F5DD
hinggaF5DF
semua memiliki 3 sifat yang sama, seperti yangF6DC
-F6DF
,F7DC
-F7DF
danF8DC
-F8DF
, untuk total 16 combo byte yang berbeda untuk memilih dari.sumber
0xDC
apakah valid UTF-8?0xDC
adalah byte utama UTF-8 untuk urutan 2-byte. Itu harus diikuti oleh10xxxxxx
byte lanjutan agar valid.0xDC
bukan byte kelanjutan yang valid, jadi0xDC 0xDC
UTF-8 tidak valid.80
-BF
.Jika Anda mencoba menggunakan karakter yang tidak dapat dicetak untuk menunjukkan "bukan teks," maka Anda akan sulit mengalahkan 0x89:
Secara umum, ketika Anda membentuk angka ajaib, "non-teks" adalah poin minor. Saya harus mencari referensi, tetapi salah satu format grafik standar (TIFF, saya pikir) memiliki sesuatu seperti enam informasi berbeda yang berguna dari angka ajaibnya.
sumber