Một cách tiếp cận là sử dụng "con số kỳ diệu" ước để đọc đầu tiên bit của một tập tin.
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html
Ví dụ:
"BM" is a Bitmap image
"GIF8" is a GIF image
"\xff\xd8\xff\xe0" is a JPEG image
Ví dụ trong Ruby:
def bitmap?(data)
return data[0,2]=="MB"
end
def gif?(data)
return data[0,4]=="GIF8"
end
def jpeg?(data)
return data[0,4]=="\xff\xd8\xff\xe0"
end
def file_is_image?(filename)
f = File.open(filename,'rb') # rb means to read using binary
data = f.read(9) # magic numbers are up to 9 bytes
f.close
return bitmap?(data) or gif?(data) or jpeg?(data)
end
Tại sao sử dụng này thay vì phần mở rộng tên tập tin hoặc các module filemagic?
Để phát hiện loại dữ liệu trước khi ghi bất kỳ dữ liệu nào vào đĩa. Ví dụ: chúng tôi có thể đọc luồng dữ liệu tải lên trước khi chúng tôi ghi bất kỳ dữ liệu nào vào đĩa. Nếu số ma thuật không khớp với loại nội dung biểu mẫu web, thì chúng tôi có thể báo cáo lỗi ngay lập tức.
Chúng tôi triển khai mã thực của chúng tôi hơi khác một chút. Chúng tôi tạo ra một băm: mỗi khóa là một chuỗi số ma thuật, mỗi giá trị là một biểu tượng như: bitmap,: gif,: jpeg, v.v. Nếu có ai muốn xem mã thế giới thực của chúng tôi, vui lòng liên hệ với tôi tại đây.
Cảm ơn bạn Sinan vì liên kết tuyệt vời! Tôi không biết điều đó tồn tại. Cảm ơn bạn. – sjsc
Lệnh tệp thực sự tuyệt vời cho việc này, vì vậy trình bao bọc này nên thực hiện công việc. – tadman