हाय, हेब्र!
हाल ही में मुझे आश्चर्य हुआ कि माइम फ़ाइल प्रकार को सही ढंग से निर्धारित करने के लिए कितने बाइट्स की आवश्यकता है। सबसे पहले, वह Google था, वह प्राप्त उत्तरों से संतुष्ट नहीं था और इसलिए उसने खुद इस विषय पर थोड़ा शोध करने का फैसला किया।
निम्न कार्य ने मुझे इस समस्या का अध्ययन करने के लिए प्रेरित किया: smb सर्वर पर स्थित फ़ाइल के MIME प्रकार का निर्धारण। मेरे पास सबसे अच्छी बात यह है कि फ़ाइल का एक टुकड़ा स्थानीय मशीन पर कॉपी करना है और फिर, इस भाग पर, इसके समय प्रकार को पहचानने का प्रयास करें।

सबसे पहले, मैं आपको बताता हूँ कि मैंने क्या देखा और मैं इसे पसंद क्यों नहीं किया:
स्टैक ओवरफ्लो 2 विकिपीडिया लिंक देता है:
- फ़ाइल हस्ताक्षर कहते हैं कि ज्यादातर मामलों में, 2-4 बाइट्स पर्याप्त हैं। हालांकि, दुर्भाग्य से यह मामला नहीं है, उदाहरण के लिए, पीडीएफ जैसे लोकप्रिय प्रारूप के लिए।
- हस्ताक्षर की सूची विभिन्न स्वरूपों की फाइलों के लिए हस्ताक्षर की कुछ सूची प्रदान करती है, लेकिन यह पूर्ण से बहुत दूर है। फिर मुझे फाइल सिग्नेचर मिले, यहाँ सब कुछ लगता है।
हालाँकि, वापस उसी पीडीएफ में। यदि आप इस स्रोत पर विश्वास करते हैं, तो यह निर्धारित करने के लिए कि फ़ाइल एक पीडीएफ है, चार बाइट्स पर्याप्त हैं (0x25 0x50 0x44 0x46), हालाँकि, पहले चार बाइट्स के आधार पर, libdirectory ने कहा कि पीडीएफ फाइल का MIME प्रकार पाठ / सादा है, और पांच में से यह सच है। आवेदन / पीडीएफ। मुझे यह जवाब देना मुश्किल है कि यह किसके साथ जुड़ा हुआ है, मुझे स्रोत को देखने की जरूरत है।
अब जो मैंने किया, उस पर वास्तव में आगे बढ़ते हैं। मैंने एक बहुत छोटा प्रोग्राम लिखा था जो एक डायरेक्टरी से सभी फाइलों को पढ़ता था, पहले एन बाइट्स को दूसरे डायरेक्टरी में कॉपी करता था, और फिर मैंने प्राप्त फाइलों की आंशिक प्रतियों से यह निर्धारित करने की कोशिश की कि यह वास्तव में क्या थी। और इसी तरह, जब तक कि फ़ाइल का हिस्सा MIME प्रकार मूल के MIME प्रकार से मेल नहीं खाता। कार्य के परिणामों के आधार पर, कार्यक्रम ने बताया कि एक प्रकार या किसी अन्य को निर्धारित करने में कितने बाइट्स लगे। यहाँ उसका कोड है:
#include <stdio.h> #include <stdlib.h> #include <magic.h> #include <sys/types.h> #include <dirent.h> #include <errno.h> #include <string.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define TEST_DIR "test-dir/" #define TMP_DIR "tmp-dir/" magic_t cookie; // Detects how many bytes required for correct MIME-type of this file void detect_size(char *filename) { int bytes = 1; int infd, outfd; char strin[100], strout[100], type[100]; char buf[4096]; strcpy(strin, TEST_DIR); strcat(strin, filename); strcpy(strout, TMP_DIR); strcat(strout, filename); while(1) { // Make a copy of given file infd = open(strin, O_RDONLY); outfd = open(strout, O_RDWR | O_CREAT, 00666); read(infd, &buf, bytes); write(outfd, &buf, bytes); lseek(infd, 0, SEEK_SET); lseek(outfd, 0, SEEK_SET); // Detect mime types of old and new const char *mime_type = magic_descriptor(cookie, infd); strcpy(type, mime_type); mime_type = magic_descriptor(cookie, outfd); // Check if mime type detected correctly if (strcmp(mime_type, type) == 0) { printf("%s detected correctly in %d bytes\n", type, bytes); unlink(strout); return; } unlink(strout); bytes++; } } int main() { DIR *dirfd = opendir(TEST_DIR); struct dirent entry, *result = NULL; cookie = magic_open(MAGIC_MIME_TYPE | MAGIC_ERROR); magic_load(cookie, NULL); while(1) { readdir_r(dirfd, &entry, &result); if (result == NULL) break; // No more entries in this directory if (!strcmp(entry.d_name, ".") || !strcmp(entry.d_name, "..")) continue; // Ignore "." and ".." detect_size(entry.d_name); } magic_close(cookie); closedir(dirfd); exit(EXIT_SUCCESS); }
फिर, परीक्षण-डीआईआर फ़ोल्डर में विभिन्न फाइलों का एक गुच्छा फेंकते हुए, मैंने प्रयोग करना शुरू कर दिया। बेशक, मुझे जो कुछ नहीं मिला वह एक पूर्ण-स्तरीय और गंभीर अध्ययन को आकर्षित करता है, लेकिन कुछ परिणाम अभी भी दिलचस्प हैं। उन्हें एक संक्षिप्त सारांश दें:
18 बाइट्स में एप्लिकेशन / एक्स-शेर्लिब का सही पता लगाया गया
1793 बाइट्स में सही ढंग से पाया गया अनुप्रयोग / msword
4 बाइट्स में छवि / gif का सही पता लगाया गया
4 बाइट्स में एप्लिकेशन / जिप का सही तरीके से पता लगाया गया
2 बाइट्स में एप्लिकेशन / एक्स-डोज़ेक्सेक का सही पता लगाया गया
आवेदन / vnd.oasis.opendocument.pretation 85 बाइट्स में सही ढंग से पता चला है
14 बाइट्स में टेक्स्ट / html का सही पता लगाया गया
2 बाइट्स में इमेज / जेपीईजी का सही पता लगाया गया
18 बाइट्स में एप्लिकेशन / एक्स-एक्जीक्यूटबल का सही पता लगाया गया
1594 बाइट्स में टेक्स्ट / एक्स-मेकफाइल का सही पता लगाया गया
18 बाइट्स में एप्लिकेशन / एक्स-एक्जीक्यूटबल का सही पता लगाया गया
2 बाइट्स में एप्लिकेशन / x-gzip का सही पता लगाया गया
2291 बाइट्स में ऑडियो / एमपीईजी का सही पता लगाया गया
27 बाइट्स में टेक्स्ट / xc का सही पता लगाया गया
4 बाइट्स में ऑडियो / एक्स-फ्लैक का सही पता लगाया गया
5 बाइट्स में एप्लिकेशन / पीडीएफ का सही पता लगाया गया
मैं कुछ चीजें नोट करता हूं जो मुझे दिलचस्प लगीं:
- ठीक है, सबसे पहले, निश्चित रूप से, पहले से ही उल्लेख किया गया पीडीएफ, जिसे 5 बाइट्स में मान्यता प्राप्त है, और 4 पर नहीं, जैसा कि आप उम्मीद करेंगे।
- और अंत में, मैं यह नोट करना चाहता हूं कि पहले एन बाइट्स द्वारा फ़ाइल के प्रकार को निर्धारित करने के विचार की सभी शीतलता के बावजूद, मेरी राय में, यह विफल रहा।
खैर, यह शायद वह सब है जो मैं इस बार बताना चाहता था, मुझे बहुत लिखना पसंद नहीं है। मुझे उम्मीद है कि यह लेख किसी के लिए दिलचस्प होगा।
आपका ध्यान देने के लिए धन्यवाद।