Tôi đang mong muốn một định dạng tập tin và tôi muốn làm điều đó đúng. Vì nó là định dạng nhị phân, nên byte (hoặc byte) đầu tiên của tệp không được tạo thành các ký tự văn bản hợp lệ (giống như trong tiêu đề tệp PNG 1 ). Điều này cho phép các công cụ không nhận dạng định dạng vẫn thấy rằng nó không phải là tệp văn bản bằng cách xem xét một vài byte đầu tiên.
Bất kỳ mật mã nào ở trên 0x7F
đều không hợp lệ US-ASCII, vì vậy điều đó thật dễ dàng. Nhưng đối với Unicode thì đó là một câu chuyện hoàn toàn khác. Ngoài các ký tự Unicode hợp lệ có ký tự dùng riêng , noncharacters và lính canh , như tôi đã tìm thấy trong Unicode Sử dụng cá nhân nhân vật, Noncharacters & Sentinel FAQ .
Điều gì sẽ là một chuỗi các byte mà tôi có thể sử dụng khi bắt đầu tập tin dẫn đến US-ASCII, UTF-8, UTF-16LE và UTF-16BE không hợp lệ?
- Rõ ràng byte đầu tiên không thể có giá trị dưới đây
0x80
vì đó sẽ là ký tự (kiểm soát) US-ASCII hợp lệ, do đó0x00
không thể được sử dụng. - Ngoài ra, vì các ký tự sử dụng riêng là các ký tự Unicode hợp lệ, tôi cũng không thể sử dụng các mật mã đó.
- Vì nó phải hoạt động với cả UTF-16 cuối nhỏ và cuối lớn, nên một loại không có vi khuẩn như
0xFFFE
là không thể vì ngược lại0xFEFF
là ký tự Unicode hợp lệ. - FAQ nêu trên đề nghị không sử dụng bất kỳ noncharacters như rằng vẫn sẽ cho kết quả trong một chuỗi Unicode hợp lệ, vì vậy cái gì đó như
0xFFFF
cũng là ra khỏi bức tranh.
Giá trị sentinel trong tương lai còn lại để tôi sử dụng là gì?
1 ) Định dạng PNG có byte đầu tiên là 0x89
giá trị không phải ASCII , theo sau là chuỗi PNG
. Một công cụ đọc một vài byte đầu tiên của PNG có thể xác định nó là một tệp nhị phân vì nó không thể diễn giải 0x89
. Mặt khác, một tệp GIF bắt đầu trực tiếp với chuỗi ASCII hợp lệ và có thể đọc được, GIF
theo sau là ba ký tự ASCII hợp lệ hơn. Đối với GIF, một công cụ có thể xác định nó là một tệp văn bản có thể đọc được. Điều này là sai và ý tưởng bắt đầu tệp với một chuỗi byte không có kết cấu xuất phát từ Thiết kế định dạng tệp của Andy McFadden.
GIF8
. Một tập tin SGI Movi bắt đầu với MOVI
. Một kiểu tệp lưu trữ zip bắt đầu bằng ZZ
, định dạng pkzip phổ biến hơn bắt đầu bằng PK
. Ràng buộc rằng byte đầu tiên là một ký tự văn bản không hợp lệ dường như không khớp với những gì được tìm thấy trong tự nhiên. Tôi tò mò tại sao đây là một yêu cầu.
Since it is a binary format, the first bytes of the file should not form valid textual characters
- Bạn nên xem tệp ma thuật (/ usr / share / magic hoặc / etc / magic trên nhiều hệ thống unix) cho thấy cách ứng dụng này xác định các loại tệp. Một tệp PNG bắt đầu bằng\x89PNG\x0d\0a\x1a\x0a
- lưu ý "PNG" trong đó, đó là một chuỗi thô. Các chuỗi\x89
và tương tự là các byte không in được.