Định dạng file

Định dạng file là một cách chuẩn để thông tin được mã hóa trong việc lưu trữ trong các file. Nó chỉ định cách các bit được sử dụng để mã hóa thông tin trong một phương tiện lưu trữ kỹ thuật số. Các định dạng file có thể là độc quyền hoặc tự do và có thể không được công bố hoặc mở.
Một số định dạng file được thiết kế cho các loại dữ liệu rất đặc biệt: ví dụ: file PNG, lưu trữ hình ảnh bitmap bằng cách sử dụng nén không mất dữ liệu. Tuy nhiên, các định dạng file khác được thiết kế để lưu trữ một số loại dữ liệu khác nhau: định dạng Ogg có thể đóng vai trò là bộ chứa cho các loại đa phương tiện khác nhau, bao gồm mọi kết hợp âm thanh và video, có hoặc không có văn bản (như phụ đề) và siêu dữ liệu. Một tệp văn bản có thể chứa bất kỳ luồng ký tự nào, bao gồm các ký tự điều khiển có thể và được mã hóa theo một trong các sơ đồ mã hóa ký tự khác nhau. Một số định dạng file, chẳng hạn như HTML, SVG và mã nguồn của phần mềm máy tính là các tệp văn bản với các cú pháp được xác định cho phép chúng được sử dụng cho các mục đích cụ thể.

Thông số kỹ thuật

Các định dạng file thường có một đặc tả được công bố mô tả phương pháp mã hóa và cho phép thử nghiệm chức năng dự định của chương trình. Không phải tất cả các định dạng đều có tài liệu đặc tả có sẵn miễn phí, một phần vì một số nhà phát triển xem tài liệu đặc tả của họ là bí mật thương mại và một phần vì các nhà phát triển khác không bao giờ tạo tài liệu đặc tả chính thức, cho phép các chương trình khác xác định định dạng.
Nếu nhà phát triển định dạng không xuất bản thông số kỹ thuật miễn phí, nhà phát triển khác muốn sử dụng loại file đó phải dò ngược file để tìm cách đọc hoặc lấy tài liệu đặc tả từ nhà phát triển định dạng có tính phí và một thỏa thuận không tiết lộ. Cách tiếp cận thứ hai chỉ có thể khi một tài liệu đặc tả chính thức tồn tại. Cả hai chiến lược đều đòi hỏi thời gian, tiền bạc hoặc cả hai; do đó, các định dạng file với thông số kỹ thuật có sẵn công khai có xu hướng được hỗ trợ bởi nhiều chương trình hơn.

Bằng sáng chế

Luật sáng chế, thay vì bản quyền, thường được sử dụng để bảo vệ định dạng file. Mặc dù bằng sáng chế cho các định dạng file không được phép trực tiếp theo luật pháp Mỹ, một số định dạng mã hóa dữ liệu bằng thuật toán được cấp bằng sáng chế. Ví dụ: sử dụng nén với định dạng tệp GIF yêu cầu sử dụng thuật toán được cấp bằng sáng chế và mặc dù chủ sở hữu bằng sáng chế ban đầu không thực thi bằng sáng chế của họ, sau đó họ bắt đầu thu phí bản quyền. Điều này đã dẫn đến việc giảm đáng kể việc sử dụng GIF và chịu trách nhiệm một phần cho việc phát triển định dạng PNG thay thế. Tuy nhiên, bằng sáng chế đã hết hạn ở Mỹ vào giữa năm 2003 và trên toàn thế giới vào giữa năm 2004.

Xác định loại file

Theo truyền thống, các hệ điều hành khác nhau thường áp dụng các cách tiếp cận khác nhau để xác định định dạng của một file cụ thể, với mỗi cách tiếp cận có những ưu điểm và nhược điểm riêng. Hầu hết các hệ điều hành hiện đại và các ứng dụng riêng lẻ cần sử dụng tất cả các cách tiếp cận sau đây để đọc các định dạng tệp "bên ngoài", nếu không hoạt động hoàn toàn với chúng.

Phần mở rộng tên file

Một phương pháp phổ biến được sử dụng bởi nhiều hệ điều hành, bao gồm Windows, Mac OS X, CP/M, DOS, VMS và VM/CMS, là xác định định dạng của file dựa trên phần cuối của tên của nó. Phần này của tên file được gọi là phần mở rộng tên file. Ví dụ: các tài liệu HTML được xác định bằng các tên kết thúc bằng .html (hoặc .htm) và hình ảnh GIF theo .gif. Trong hệ thống tệp FAT ban đầu, tên file được giới hạn ở định danh tám ký tự và phần mở rộng ba ký tự, được gọi là tên tệp 8.3. Có rất nhiều phần mở rộng ba chữ cái, vì vậy, thường thì mọi phần mở rộng đã cho có thể được liên kết với nhiều chương trình. Nhiều định dạng vẫn sử dụng các phần mở rộng ba ký tự mặc dù các hệ điều hành và chương trình ứng dụng hiện đại không còn giới hạn này nữa. Vì không có danh sách các tiện ích mở rộng tiêu chuẩn, nhiều định dạng có thể sử dụng cùng một tiện ích mở rộng, điều này có thể gây nhầm lẫn cho cả hệ điều hành và người dùng.
Một yếu tố của cách tiếp cận này là hệ thống có thể dễ dàng bị đối xử lý với một file theo định dạng khác chỉ bằng cách đổi tên nó - ví dụ, file HTML có thể dễ dàng được coi là văn bản thuần túy bằng cách đổi tên từ filename.html thành filename.txt. Mặc dù chiến lược này hữu ích với những người dùng chuyên gia có thể dễ dàng hiểu và thao tác thông tin này, nhưng nó thường gây nhầm lẫn cho những người dùng ít kỹ thuật hơn, những người có thể vô tình làm cho một file không thể sử dụng (hoặc "mất" nó) bằng cách đổi tên không chính xác.
Điều này khiến các hệ điều hành gần đây hơn, chẳng hạn như Windows 95 và Mac OS X, ẩn phần mở rộng khi liệt kê các file. Điều này ngăn người dùng vô tình thay đổi loại file và cho phép người dùng chuyên gia tắt tính năng này và hiển thị các tiện ích mở rộng.
Tuy nhiên, ẩn phần mở rộng có thể tạo ra sự xuất hiện của hai hoặc nhiều tên file giống nhau trong cùng một thư mục. Ví dụ: logo công ty có thể cần cả ở định dạng <tt id="mwUQ">.eps</tt> (để xuất bản) và định dạng .png (cho các trang web). Với các phần mở rộng có thể nhìn thấy, chúng sẽ xuất hiện dưới dạng tên tệp duy nhất "CompanyLogo.eps" và "CompanyLogo.png". Mặt khác, việc ẩn các tiện ích mở rộng sẽ khiến cả hai xuất hiện dưới dạng "CompanyLogo".
Ẩn tiện ích mở rộng cũng có thể gây ra rủi ro bảo mật. Ví dụ: người dùng độc hại có thể tạo một chương trình thực thi với tên vô tội, chẳng hạn như "Holiday photo.jpg.exe".".Exe" sẽ bị ẩn và người dùng sẽ thấy "Holiday photo.jpg ", có vẻ như là một hình ảnh JPEG, không thể làm hại máy lưu cho các lỗi trong ứng dụng được sử dụng để xem nó. Tuy nhiên, hệ điều hành vẫn sẽ thấy phần mở rộng ".exe" và do đó chạy chương trình, sau đó có thể gây hại cho máy tính. Điều tương tự cũng đúng với các file chỉ có một phần mở rộng: vì nó không được hiển thị cho người dùng, không có thông tin nào về file có thể được suy luận mà không điều tra rõ ràng về file. Phần mở rộng có thể bị giả mạo. Một số virus macro Word tạo một file Word ở định dạng mẫu và lưu nó với một phần mở rộng.DOC. Vì Word thường bỏ qua các phần mở rộng và xem định dạng của file, những file này sẽ mở dưới dạng mẫu, thực thi và phát tán vi-rút. Để lừa thêm người dùng, có thể lưu trữ một biểu tượng bên trong chương trình, trong trường hợp đó, việc gán biểu tượng của một số hệ điều hành cho file thực thi (.exe) sẽ bị ghi đè bằng một biểu tượng thường được sử dụng để thể hiện hình ảnh JPEG như một hình ảnh. Vấn đề này đòi hỏi người dùng có các tiện ích mở rộng bị ẩn phải cảnh giác và không bao giờ để hệ điều hành chọn chương trình nào để mở tệp không đáng tin cậy (điều này mâu thuẫn với ý tưởng làm cho mọi thứ dễ dàng hơn cho người dùng). Điều này thể hiện một vấn đề thực tế cho các hệ thống Windows, nơi ẩn tiện ích mở rộng được bật theo mặc định.

Siêu dữ liệu nội bộ

Cách thứ hai để xác định định dạng file là sử dụng thông tin liên quan đến định dạng được lưu trữ bên trong file, thông tin có nghĩa cho mục đích này hoặc chuỗi nhị phân luôn lưu trữ ở các vị trí cụ thể trong một số định dạng. Vì vị trí dễ nhất để xác định vị trí của chúng là ở đầu, khu vực như vậy thường được gọi là file header khi nó lớn hơn một vài byte hoặc một số magic number nếu nó chỉ dài vài byte.

File header

Siêu dữ liệu chứa trong file header thường được lưu trữ ở đầu file, nhưng cũng có thể có ở các khu vực khác, thường bao gồm cả cuối file, tùy thuộc vào định dạng file hoặc loại dữ liệu được chứa. Các file dựa trên ký tự (văn bản) thường có các tiêu đề dựa trên ký tự, trong khi các định dạng nhị phân thường có các tiêu đề nhị phân, mặc dù đây không phải là quy tắc. Các tiêu đề file dựa trên văn bản thường chiếm nhiều dung lượng hơn, nhưng có thể đọc được bằng con người, chúng có thể dễ dàng được kiểm tra bằng cách sử dụng phần mềm đơn giản như trình soạn thảo văn bản hoặc trình soạn thảo Hex.
Cũng như xác định định dạng file, các tiêu đề file có thể chứa siêu dữ liệu về file và nội dung của file. Ví dụ: hầu hết các file hình ảnh lưu trữ thông tin về định dạng hình ảnh, kích thước, độ phân giải và không gian màu và tùy chọn thông tin tác giả như ai đã tạo ra hình ảnh, khi nào và ở đâu, chế độ máy ảnh và cài đặt ảnh nào được sử dụng (Exif). Siêu dữ liệu như vậy có thể được sử dụng bằng phần mềm đọc hoặc giải thích file trong quá trình tải và sau đó.
Các tiêu đề file có thể được sử dụng bởi một hệ điều hành để nhanh chóng thu thập thông tin về một file mà không tải tất cả vào bộ nhớ, nhưng làm như vậy sẽ sử dụng nhiều tài nguyên của máy tính hơn là đọc trực tiếp từ thông tin thư mục. Ví dụ, khi trình quản lý file đồ họa phải hiển thị nội dung của thư mục, nó phải đọc các tiêu đề của nhiều tệp trước khi có thể hiển thị các biểu tượng thích hợp, nhưng chúng sẽ được đặt ở các vị trí khác nhau trên phương tiện lưu trữ, do đó mất nhiều thời gian hơn để truy cập. Một thư mục chứa nhiều file có siêu dữ liệu phức tạp như thông tin hình thu nhỏ có thể cần thời gian đáng kể trước khi có thể được hiển thị.
Nếu một tiêu đề được mã hóa nhị phân sao cho chính tiêu đề cần diễn giải phức tạp để được nhận ra, đặc biệt là vì mục đích bảo vệ nội dung siêu dữ liệu, có nguy cơ định dạng file có thể bị hiểu sai. Nó thậm chí có thể đã được viết xấu tại nguồn. Điều này có thể dẫn đến siêu dữ liệu bị hỏng, trong trường hợp cực kỳ xấu, thậm chí có thể khiến file không thể đọc được.
Một ví dụ phức tạp hơn về các tiêu đề file là những tiêu đề được sử dụng cho các định dạng file của trình bao bọc (hoặc vùng chứa).

Magic number

Một cách để kết hợp siêu dữ liệu loại file, thường được liên kết với Unix và các dẫn xuất của nó, chỉ là lưu trữ "số ma thuật" bên trong file. Ban đầu, thuật ngữ này được sử dụng cho một bộ định danh 2 byte cụ thể khi bắt đầu các file, nhưng vì bất kỳ chuỗi nhị phân nào cũng có thể được coi là một số, bất kỳ tính năng nào của định dạng file phân biệt duy nhất có thể được sử dụng để nhận dạng. Chẳng hạn, hình ảnh GIF luôn bắt đầu bằng đại diện ASCII của GIF87a hoặc GIF89a, tùy thuộc vào tiêu chuẩn mà chúng tuân thủ. Nhiều loại file, đặc biệt là file văn bản thuần, khó phát hiện hơn bằng phương pháp này. Ví dụ, các file HTML có thể bắt đầu bằng chuỗi < html> (không phân biệt chữ hoa chữ thường) hoặc định nghĩa loại tài liệu phù hợp bắt đầu bằng <! DOCTYPE HTML>, hoặc, đối với XHTML, mã định danh XML, bắt đầu bằng <?Xml. Các file cũng có thể bắt đầu bằng các nhận xét HTML, văn bản ngẫu nhiên hoặc một số dòng trống, nhưng vẫn có thể sử dụng được HTML.
Phương pháp số ma thuật đảm bảo tốt hơn rằng định dạng sẽ được xác định chính xác và thường có thể xác định thông tin chính xác hơn về file. Do các phép thử "số ma thuật" đáng tin cậy có thể khá phức tạp và mỗi file phải được kiểm tra hiệu quả trước mọi khả năng trong cơ sở dữ liệu ma thuật, nên cách tiếp cận này tương đối không hiệu quả, đặc biệt là để hiển thị danh sách lớn các file (ngược lại, tên file và siêu dữ liệu- các phương thức dựa trên chỉ cần kiểm tra một phần dữ liệu và đối chiếu nó với một chỉ mục được sắp xếp). Ngoài ra, dữ liệu phải được đọc từ chính file, tăng độ trễ so với siêu dữ liệu được lưu trữ trong thư mục. Khi các loại file không cho phép nhận dạng theo cách này, hệ thống phải quay lại siêu dữ liệu. Tuy nhiên, đây là cách tốt nhất để chương trình kiểm tra xem file đã được xử lý có đúng định dạng hay không: trong khi tên hoặc siêu dữ liệu của file có thể bị thay đổi độc lập với nội dung của nó, không thực hiện kiểm tra số ma thuật được thiết kế tốt là một dấu hiệu khá chắc chắn rằng file bị hỏng hoặc sai loại. Mặt khác, một số ma thuật hợp lệ không đảm bảo rằng file không bị hỏng hoặc thuộc loại chính xác.
Cái gọi là dòng shebang trong file script là trường hợp đặc biệt của số ma thuật. Ở đây, số ma thuật là văn bản có thể đọc được bằng con người xác định một trình thông dịch lệnh cụ thể và các tùy chọn sẽ được chuyển cho trình thông dịch lệnh.
Một hệ điều hành khác sử dụng số ma thuật là AmigaOS, trong đó số ma thuật được gọi là "Magic Cookies" và được sử dụng như một hệ thống tiêu chuẩn để nhận ra các file thực thi ở định dạng file thực thi Hunk và cũng để các chương trình, công cụ và tiện ích đơn lẻ tự động xử lý các file dữ liệu đã lưu của chúng hoặc bất kỳ loại file nào khác khi lưu và tải dữ liệu. Hệ thống này sau đó được cải tiến với hệ thống nhận dạng Datatype tiêu chuẩn Amiga. Một phương pháp khác là phương pháp FourCC, bắt nguồn từ OSType trên Macintosh, sau đó được điều chỉnh bởi Định dạng tệp trao đổi (IFF) và các dẫn xuất.

Siêu dữ liệu bên ngoài

Cách cuối cùng để lưu trữ định dạng của file là lưu trữ rõ ràng thông tin về định dạng trong hệ thống file, thay vì trong chính file.
Cách tiếp cận này giữ siêu dữ liệu tách biệt với cả dữ liệu chính và tên, nhưng cũng ít di động hơn so với phần mở rộng file hoặc "số ma thuật", vì định dạng phải được chuyển đổi từ hệ thống file sang hệ thống file. Mặc dù điều này cũng đúng với các phần mở rộng tên file - ví dụ, để tương thích với giới hạn ba ký tự của MS-DOS - hầu hết các dạng lưu trữ có định nghĩa gần giống với dữ liệu và tên của file, nhưng có thể thay đổi hoặc không có đại diện metadata nào.
Lưu ý rằng file zip hoặc file lưu trữ giải quyết vấn đề xử lý siêu dữ liệu. Một chương trình tiện ích thu thập nhiều file cùng với siêu dữ liệu về mỗi file và các folders/directories mà chúng đến từ tất cả trong một file mới (ví dụ: file zip có đuôi.zip). File mới cũng được nén và có thể được mã hóa, nhưng giờ đây có thể truyền thành một file duy nhất trên các hệ điều hành bởi các hệ thống FTP hoặc được đính kèm vào email. Tại đích, nó phải được giải nén bởi một tiện ích tương thích để có ích, nhưng các vấn đề về truyền được giải quyết theo cách này.

Mã loại Mac OS

Hierarchical File System của Mac OS lưu trữ mã cho người tạo và nhập như một phần của mục nhập thư mục cho mỗi file. Các mã này được gọi là OSTypes. Các mã này có thể là bất kỳ chuỗi 4 byte nào, nhưng thường được chọn sao cho biểu diễn ASCII tạo thành một chuỗi các ký tự có ý nghĩa, chẳng hạn như viết tắt tên của ứng dụng hoặc tên viết tắt của nhà phát triển. Ví dụ: file "ngăn xếp" của HyperCard có người tạo WILD (từ tên trước đó của Hypercard, "WildCard") và một loại STAK. Trình soạn thảo văn bản BBEdit có mã người tạo R*ch đề cập đến lập trình viên gốc của nó, Rich Siegel. Mã loại chỉ định định dạng của file, trong khi mã người tạo chỉ định chương trình mặc định để mở file khi người dùng nhấp đúp. Ví dụ: người dùng có thể có một số file văn bản tất cả với mã loại Text, nhưng mỗi file mở trong một chương trình khác nhau, do có mã người tạo khác nhau. Tính năng này được dự định để, ví dụ, các file văn bản đơn giản có thể đọc được có thể được mở trong trình soạn thảo văn bản cho mục đích chung, trong khi các file lập trình hoặc mã HTML sẽ mở trong một trình soạn thảo hoặc IDE chuyên dụng, nhưng tính năng này thường là nguồn sự nhầm lẫn của người dùng vì chương trình nào sẽ khởi chạy khi các file được nhấp đúp thường không thể đoán trước. Hệ điều hành RISC sử dụng một hệ thống tương tự, bao gồm số 12 bit có thể tra cứu trong bảng mô tả, ví dụ số thập lục phân FF5 là "bí danh" đối với PoScript, đại diện cho file PostScript.

Thuộc tính mở rộng POSIX

Trên các hệ thống tương tự Unix và Unix, các hệ thống file ext2, ext3, ReiserFS phiên bản 3, XFS, JFS, FFS và HFS+ cho phép lưu trữ các thuộc tính mở rộng với các file. Chúng bao gồm một danh sách các chuỗi "name = value" tùy ý, trong đó các tên là duy nhất và một giá trị có thể được truy cập thông qua tên liên quan của nó.

Mã định danh duy nhất PRONOM (PUID)

Mã định danh duy nhất liên tục PRONOM (PUID) là một chương trình mở rộng gồm các định danh liên tục, duy nhất và rõ ràng cho các định dạng file, được phát triển bởi <a href="https://en.wikipedia.org/wiki/The_National_Archives_(UK)" rel="mw:WikiLink" data-linkid="null">The National Archives of the UK</a> như một phần của dịch vụ đăng ký kỹ thuật PRONOM. PUID có thể được thể hiện dưới dạng Định danh tài nguyên đồng nhất bằng cách sử dụng namespace info:pronom/. Mặc dù chưa được sử dụng rộng rãi bên ngoài chính phủ Vương quốc Anh và một số chương trình bảo quản kỹ thuật số, chương trình PUID cung cấp mức độ chi tiết cao hơn so với hầu hết các chương trình thay thế.

MIME types

MIME types được sử dụng ngày càng rộng rãi trong nhiều ứng dụng liên quan đến Internet và ở nhiều nơi khác, mặc dù việc sử dụng chúng cho thông tin loại trên đĩa rất hiếm. Chúng bao gồm một hệ thống định danh được tiêu chuẩn hóa (được quản lý bởi IANA) bao gồm một type và một sub-type, được phân tách bằng dấu gạch chéo - ví dụ: text/html hoặc image/gif. Chúng ban đầu được dự định như một cách để xác định loại file nào được đính kèm vào e-mail, độc lập với hệ điều hành nguồn và đích. MIME types xác định các file trên BeOS, AmigaOS 4.0 và MorphOS, cũng như lưu trữ các chữ ký ứng dụng duy nhất để khởi chạy ứng dụng. Trong AmigaOS và MorphOS, hệ thống MIME types hoạt động song song với hệ thống Datatype cụ thể của Amiga.
Có vấn đề với các MIME types; một số tổ chức và nhiều người đã tạo các MIME types của riêng họ mà không đăng ký chúng đúng cách với IANA, điều này khiến việc sử dụng tiêu chuẩn này trở nên khó xử trong một số trường hợp.

Định danh định dạng file (FFID)

Định danh file định dạng là một cách khác, không được sử dụng rộng rãi để xác định định dạng file theo nguồn gốc và loại file của chúng. Nó được tạo ra cho bộ phần mềm Description Explorer. Nó bao gồm một số chữ số có dạng NNNNNNNNN-XX-YYYYYYY. Phần đầu tiên cho biết nguồn gốc/người duy trì tổ chức (số này biểu thị một giá trị trong cơ sở dữ liệu tổ chức công ty/tiêu chuẩn), 2 chữ số sau phân loại loại file theo hệ thập lục phân. Phần cuối cùng bao gồm phần mở rộng file thông thường của file hoặc số tiêu chuẩn quốc tế của file, được đệm bằng số không. Ví dụ: đặc tả file PNG có FFID là 000000001-31-0015948 trong đó 31 chỉ ra file hình ảnh, 0015948 là số chuẩn và 000000001 biểu thị Tổ chức ISO.

Định dạng dựa trên nội dung file

Một cách khác nhưng ít phổ biến hơn để xác định định dạng file là kiểm tra nội dung file để biết các mẫu có thể phân biệt giữa các loại file. Nội dung của một file là một chuỗi các byte và một byte có 256 hoán vị duy nhất (0 đến 255). Do đó, việc đếm sự xuất hiện của các mẫu byte thường được gọi là phân phối tần số byte cung cấp các mẫu có thể phân biệt để xác định các loại file. Có nhiều lược đồ nhận dạng loại file dựa trên nội dung sử dụng phân phối tần số byte để xây dựng các mô hình đại diện cho loại file và sử dụng bất kỳ kỹ thuật khai thác dữ liệu và thống kê nào để xác định loại file

Cấu trúc file

Có một số cách để cấu trúc dữ liệu trong một file. Những cách phổ biến nhất được mô tả dưới đây.

Các định dạng không cấu trúc (bãi chứa bộ nhớ thô)

Các định dạng file trước đó đã sử dụng các định dạng dữ liệu thô bao gồm trực tiếp đổ hình ảnh bộ nhớ của một hoặc nhiều cấu trúc vào file.
Điều này có một số nhược điểm. Trừ khi các hình ảnh bộ nhớ cũng có không gian dành riêng cho các phần mở rộng trong tương lai, việc mở rộng và cải thiện loại file có cấu trúc này là rất khó khăn. Nó cũng tạo các file có thể dành riêng cho một nền tảng hoặc ngôn ngữ lập trình (ví dụ: cấu trúc chứa chuỗi Pascal không được nhận dạng như vậy trong C). Mặt khác, việc phát triển các công cụ để đọc và viết các loại tệp này rất đơn giản.
Những hạn chế của các định dạng phi cấu trúc đã dẫn đến sự phát triển của các loại định dạng file khác có thể dễ dàng mở rộng và tương thích ngược cùng một lúc.

Định dạng dựa trên thư mục

Đây là một định dạng mở rộng khác, gần giống với một hệ thống file (Tài liệu OLE là các hệ thống file thực tế), trong đó file bao gồm các 'mục nhập thư mục' có chứa vị trí của dữ liệu trong chính file cũng như chữ ký của nó trường hợp loại của nó). Ví dụ điển hình của các loại cấu trúc file này là ảnh đĩa, tài liệu OLE TIFF, thư viện. ODT và DOCX, được dựa trên PKZip được chunk và cũng mang một thư mục.